From fa467112ccc6c44a495a710d2f7df6955d219464 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 29 Oct 2020 15:14:12 +0100 Subject: [PATCH 001/164] Update create wallet dialog --- src/qt/createwalletdialog.cpp | 11 ++ src/qt/createwalletdialog.h | 1 + src/qt/forms/createwalletdialog.ui | 209 ++++++++++++++++------------- 3 files changed, 126 insertions(+), 95 deletions(-) diff --git a/src/qt/createwalletdialog.cpp b/src/qt/createwalletdialog.cpp index 8e6474b0d4..f73c10582a 100644 --- a/src/qt/createwalletdialog.cpp +++ b/src/qt/createwalletdialog.cpp @@ -33,6 +33,12 @@ CreateWalletDialog::CreateWalletDialog(QWidget* parent) : if (!ui->disable_privkeys_checkbox->isEnabled()) { ui->disable_privkeys_checkbox->setChecked(false); } + + if(checked) ui->hardware_wallet_checkbox->setChecked(false); + }); + + connect(ui->hardware_wallet_checkbox, &QCheckBox::toggled, [this](bool checked) { + if(checked) ui->encrypt_wallet_checkbox->setChecked(false); }); } @@ -60,3 +66,8 @@ bool CreateWalletDialog::isMakeBlankWalletChecked() const { return ui->blank_wallet_checkbox->isChecked(); } + +bool CreateWalletDialog::isHardwareWalletCheckbox() const +{ + return ui->hardware_wallet_checkbox->isChecked(); +} diff --git a/src/qt/createwalletdialog.h b/src/qt/createwalletdialog.h index 30766107b9..aa6b996046 100644 --- a/src/qt/createwalletdialog.h +++ b/src/qt/createwalletdialog.h @@ -27,6 +27,7 @@ class CreateWalletDialog : public QDialog bool isEncryptWalletChecked() const; bool isDisablePrivateKeysChecked() const; bool isMakeBlankWalletChecked() const; + bool isHardwareWalletCheckbox() const; private: Ui::CreateWalletDialog *ui; diff --git a/src/qt/forms/createwalletdialog.ui b/src/qt/forms/createwalletdialog.ui index e49bab8f3b..efd358e47e 100644 --- a/src/qt/forms/createwalletdialog.ui +++ b/src/qt/forms/createwalletdialog.ui @@ -6,106 +6,125 @@ 0 0 - 364 - 185 + 363 + 239 + + + 0 + 0 + + Create Wallet - - - - 10 - 140 - 341 - 32 - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - 120 - 20 - 231 - 24 - - - - - - - 20 - 20 - 101 - 21 - - - - Wallet Name - - - - - - 20 - 50 - 171 - 22 - - - - Encrypt the wallet. The wallet will be encrypted with a passphrase of your choice. - - - Encrypt Wallet - - - true - - - - - false - - - - 20 - 80 - 171 - 22 - - - - Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets. - - - Disable Private Keys - - - - - - 20 - 110 - 171 - 22 - - - - Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time. - - - Make Blank Wallet - - + + + 10 + + + 20 + + + 20 + + + 15 + + + 15 + + + + + + + Wallet Name + + + + + + + + + + + + Encrypt the wallet. The wallet will be encrypted with a passphrase of your choice. + + + Encrypt Wallet + + + true + + + + + + + false + + + Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets. + + + Disable Private Keys + + + + + + + Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time. + + + Make Blank Wallet + + + + + + + Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time. + + + Use a hardware device + + + + + + + Qt::Vertical + + + + 20 + 0 + + + + + + + + + 0 + 0 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + wallet_name_line_edit From 8a35d543bd920a1b974b86a10b134ef4c4295e46 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 30 Oct 2020 09:21:58 +0100 Subject: [PATCH 002/164] Add hardware keystore dialog --- src/Makefile.qt.include | 4 ++ src/qt/forms/hardwarekeystoredialog.ui | 96 ++++++++++++++++++++++++++ src/qt/hardwarekeystoredialog.cpp | 18 +++++ src/qt/hardwarekeystoredialog.h | 22 ++++++ 4 files changed, 140 insertions(+) create mode 100644 src/qt/forms/hardwarekeystoredialog.ui create mode 100644 src/qt/hardwarekeystoredialog.cpp create mode 100644 src/qt/hardwarekeystoredialog.h diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index 2892495290..4a2c30d5cc 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -26,6 +26,7 @@ QT_FORMS_UI = \ qt/forms/editaddressdialog.ui \ qt/forms/editcontractinfodialog.ui \ qt/forms/editsuperstakerdialog.ui \ + qt/forms/hardwarekeystoredialog.ui \ qt/forms/helpmessagedialog.ui \ qt/forms/intro.ui \ qt/forms/modaloverlay.ui \ @@ -92,6 +93,7 @@ QT_MOC_CPP = \ qt/moc_editaddressdialog.cpp \ qt/moc_editcontractinfodialog.cpp \ qt/moc_editsuperstakerdialog.cpp \ + qt/moc_hardwarekeystoredialog.cpp \ qt/moc_guiutil.cpp \ qt/moc_intro.cpp \ qt/moc_macdockiconhandler.cpp \ @@ -218,6 +220,7 @@ BITCOIN_QT_H = \ qt/editsuperstakerdialog.h \ qt/eventlog.h \ qt/execrpccommand.h \ + qt/hardwarekeystoredialog.h \ qt/guiconstants.h \ qt/guiutil.h \ qt/intro.h \ @@ -442,6 +445,7 @@ BITCOIN_QT_WALLET_CPP = \ qt/editaddressdialog.cpp \ qt/editcontractinfodialog.cpp \ qt/editsuperstakerdialog.cpp \ + qt/hardwarekeystoredialog.cpp \ qt/openuridialog.cpp \ qt/overviewpage.cpp \ qt/paymentserver.cpp \ diff --git a/src/qt/forms/hardwarekeystoredialog.ui b/src/qt/forms/hardwarekeystoredialog.ui new file mode 100644 index 0000000000..088fad9296 --- /dev/null +++ b/src/qt/forms/hardwarekeystoredialog.ui @@ -0,0 +1,96 @@ + + + HardwareKeystoreDialog + + + + 0 + 0 + 475 + 300 + + + + Hardware Keystore + + + + + + + 15 + + + 20 + + + 20 + + + 15 + + + 15 + + + + + + 0 + 0 + + + + Select a device: + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + HardwareKeystoreDialog + accept() + + + 20 + 20 + + + 20 + 20 + + + + + buttonBox + rejected() + HardwareKeystoreDialog + reject() + + + 20 + 20 + + + 20 + 20 + + + + + diff --git a/src/qt/hardwarekeystoredialog.cpp b/src/qt/hardwarekeystoredialog.cpp new file mode 100644 index 0000000000..2a80c16592 --- /dev/null +++ b/src/qt/hardwarekeystoredialog.cpp @@ -0,0 +1,18 @@ +#if defined(HAVE_CONFIG_H) +#include +#endif + +#include +#include + +HardwareKeystoreDialog::HardwareKeystoreDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::HardwareKeystoreDialog) +{ + ui->setupUi(this); +} + +HardwareKeystoreDialog::~HardwareKeystoreDialog() +{ + delete ui; +} diff --git a/src/qt/hardwarekeystoredialog.h b/src/qt/hardwarekeystoredialog.h new file mode 100644 index 0000000000..2bbf7c45cd --- /dev/null +++ b/src/qt/hardwarekeystoredialog.h @@ -0,0 +1,22 @@ +#ifndef HARDWAREKEYSTOREDIALOG_H +#define HARDWAREKEYSTOREDIALOG_H + +#include + +namespace Ui { +class HardwareKeystoreDialog; +} + +class HardwareKeystoreDialog : public QDialog +{ + Q_OBJECT + +public: + explicit HardwareKeystoreDialog(QWidget *parent = 0); + ~HardwareKeystoreDialog(); + +private: + Ui::HardwareKeystoreDialog *ui; +}; + +#endif // HARDWAREKEYSTOREDIALOG_H From aba3b57cd04125639a694d032470de42fd3ad3ff Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 30 Oct 2020 13:50:14 +0100 Subject: [PATCH 003/164] Update hardware keystore dialog --- src/qt/forms/hardwarekeystoredialog.ui | 1 - src/qt/hardwarekeystoredialog.cpp | 40 +++++++++++++++++++++++++- src/qt/hardwarekeystoredialog.h | 8 +++++- 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/qt/forms/hardwarekeystoredialog.ui b/src/qt/forms/hardwarekeystoredialog.ui index 088fad9296..36e490f80a 100644 --- a/src/qt/forms/hardwarekeystoredialog.ui +++ b/src/qt/forms/hardwarekeystoredialog.ui @@ -43,7 +43,6 @@ Select a device: - diff --git a/src/qt/hardwarekeystoredialog.cpp b/src/qt/hardwarekeystoredialog.cpp index 2a80c16592..649d377e67 100644 --- a/src/qt/hardwarekeystoredialog.cpp +++ b/src/qt/hardwarekeystoredialog.cpp @@ -4,15 +4,53 @@ #include #include +#include +#include -HardwareKeystoreDialog::HardwareKeystoreDialog(QWidget *parent) : +class HardwareKeystoreDialogPriv +{ +public: + QList devices; +}; + +HardwareKeystoreDialog::HardwareKeystoreDialog(const QStringList& devices, QWidget *parent) : QDialog(parent), ui(new Ui::HardwareKeystoreDialog) { ui->setupUi(this); + + d = new HardwareKeystoreDialogPriv(); + QVBoxLayout* boxLayout = new QVBoxLayout(ui->groupBoxDevices); + for(QString deviceName : devices) + { + QRadioButton *deviceWidget = new QRadioButton(deviceName, this); + boxLayout->addWidget(deviceWidget); + d->devices.push_back(deviceWidget); + } + boxLayout->addStretch(1); + setCurrentIndex(0); } HardwareKeystoreDialog::~HardwareKeystoreDialog() { delete ui; + delete d; +} + +int HardwareKeystoreDialog::currentIndex() const +{ + for(int index = 0; index < d->devices.size(); index++) + { + if(d->devices[index]->isChecked()) + return index; + } + return -1; +} + +void HardwareKeystoreDialog::setCurrentIndex(int index) +{ + if(index >=0 && index < d->devices.size()) + { + d->devices[index]->setChecked(true); + } } diff --git a/src/qt/hardwarekeystoredialog.h b/src/qt/hardwarekeystoredialog.h index 2bbf7c45cd..88dea801d2 100644 --- a/src/qt/hardwarekeystoredialog.h +++ b/src/qt/hardwarekeystoredialog.h @@ -2,21 +2,27 @@ #define HARDWAREKEYSTOREDIALOG_H #include +#include namespace Ui { class HardwareKeystoreDialog; } +class HardwareKeystoreDialogPriv; + class HardwareKeystoreDialog : public QDialog { Q_OBJECT public: - explicit HardwareKeystoreDialog(QWidget *parent = 0); + explicit HardwareKeystoreDialog(const QStringList& devices, QWidget *parent = 0); ~HardwareKeystoreDialog(); + int currentIndex() const; + void setCurrentIndex(int index); private: Ui::HardwareKeystoreDialog *ui; + HardwareKeystoreDialogPriv *d; }; #endif // HARDWAREKEYSTOREDIALOG_H From d9d996de7f54a6eddf43f18ff0dc8d8ef4d2fc34 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Tue, 3 Nov 2020 14:54:02 +0100 Subject: [PATCH 004/164] Add qtum hwi tool command line wrapper --- src/Makefile.qt.include | 7 +- src/qt/qtumhwitool.cpp | 200 ++++++++++++++++++++++++++++++++++++++++ src/qt/qtumhwitool.h | 95 +++++++++++++++++++ 3 files changed, 300 insertions(+), 2 deletions(-) create mode 100644 src/qt/qtumhwitool.cpp create mode 100644 src/qt/qtumhwitool.h diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index 4a2c30d5cc..1bfbed4fd2 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -154,6 +154,7 @@ QT_MOC_CPP = \ qt/moc_utilitydialog.cpp \ qt/moc_walletcontroller.cpp \ qt/moc_qtumversionchecker.cpp \ + qt/moc_qtumhwitool.cpp \ qt/moc_walletframe.cpp \ qt/moc_walletmodel.cpp \ qt/moc_walletview.cpp @@ -295,7 +296,8 @@ BITCOIN_QT_H = \ qt/walletmodeltransaction.h \ qt/walletview.h \ qt/winshutdownmonitor.h \ - qt/qtumpushbutton.h + qt/qtumpushbutton.h \ + qt/qtumhwitool.h RES_ICONS = \ qt/res/icons/add.png \ @@ -410,7 +412,8 @@ BITCOIN_QT_BASE_CPP = \ qt/trafficgraphwidget.cpp \ qt/utilitydialog.cpp\ qt/qtumversionchecker.cpp \ - qt/qtumpushbutton.cpp + qt/qtumpushbutton.cpp \ + qt/qtumhwitool.cpp BITCOIN_QT_WINDOWS_CPP = qt/winshutdownmonitor.cpp diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp new file mode 100644 index 0000000000..33e67357db --- /dev/null +++ b/src/qt/qtumhwitool.cpp @@ -0,0 +1,200 @@ +#include + +#include +#include +#include +#include +#include + +#include + +class QtumHwiToolPriv +{ +public: + std::atomic fStarted{false}; + QProcess process; + QString strStdout; + QString strStderr; + QString toolPath; + QStringList arguments; +}; + +QtumHwiTool::QtumHwiTool(QObject *parent) : QObject(parent) +{ + d = new QtumHwiToolPriv(); +} + +QtumHwiTool::~QtumHwiTool() +{ + delete d; +} + +bool QtumHwiTool::enumerate(QList &devices) +{ + // Enumerate hardware wallet devices + if(isStarted()) + return false; + + if(!beginEnumerate(devices)) + return false; + + wait(); + + return endEnumerate(devices); +} + +bool QtumHwiTool::isConnected(const QString &fingerprint) +{ + // Check if a device is connected + QList devices; + if(enumerate(devices)) + { + for(HWDevice device: devices) + { + if(device.fingerprint == fingerprint) + return true; + } + } + return false; +} + +bool QtumHwiTool::getKeyPool(const QString &fingerprint, QString &desc) +{ + // Get the key pool for a device + if(isStarted()) + return false; + + if(!beginGetKeyPool(fingerprint, desc)) + return false; + + wait(); + + return endGetKeyPool(fingerprint, desc); +} + +bool QtumHwiTool::signTx(const QString &fingerprint, QString &psbt) +{ + // Sign PSBT transaction + if(isStarted()) + return false; + + if(!beginSignTx(fingerprint, psbt)) + return false; + + wait(); + + return endSignTx(fingerprint, psbt); +} + +QString QtumHwiTool::errorMessage() +{ + // Get the last error message + if(d->fStarted) + return tr("Started"); + + return d->strStderr; +} + +bool QtumHwiTool::isStarted() +{ + return d->fStarted; +} + +void QtumHwiTool::wait() +{ + if(d->fStarted) + { + d->process.waitForFinished(-1); + d->strStdout = d->process.readAllStandardOutput(); + d->strStderr = d->process.readAllStandardError(); + d->fStarted = false; + } +} + +bool QtumHwiTool::beginEnumerate(QList &devices) +{ + Q_UNUSED(devices); + + // Execute command line + QStringList arguments = d->arguments; + arguments << "enumerate"; + d->process.start(d->toolPath, arguments); + d->fStarted = true; + + return d->fStarted; +} + +bool QtumHwiTool::beginGetKeyPool(const QString &fingerprint, QString &desc) +{ + Q_UNUSED(desc); + + // Execute command line + QStringList arguments = d->arguments; + arguments << "-f" << fingerprint << "getkeypool" << "--wpkh" << "0" << "1000"; + d->process.start(d->toolPath, arguments); + d->fStarted = true; + + return d->fStarted; +} + +bool QtumHwiTool::beginSignTx(const QString &fingerprint, QString &psbt) +{ + // Execute command line + QStringList arguments = d->arguments; + arguments << "-f" << fingerprint << "signtx" << psbt; + d->process.start(d->toolPath, arguments); + d->fStarted = true; + + return d->fStarted; +} + +bool QtumHwiTool::endEnumerate(QList &devices) +{ + // Decode command line results + QJsonDocument jsonDocument = QJsonDocument::fromJson(d->strStdout.toUtf8()); + QJsonArray jsonDevices = jsonDocument.array(); + for(QJsonValue jsonDevice : jsonDevices) + { + if(!jsonDevice.isObject()) + return false; + + // Get device info + QVariantMap data = jsonDevice.toObject().toVariantMap(); + HWDevice device; + device.fingerprint = data["fingerprint"].toString(); + device.serial_number = data["serial_number"].toString(); + device.type = data["type"].toString(); + device.path = data["path"].toString(); + device.error = data["error"].toString(); + devices.push_back(device); + } + + return devices.size() > 0; +} + +bool QtumHwiTool::endGetKeyPool(const QString &fingerprint, QString &desc) +{ + Q_UNUSED(fingerprint); + + // Decode command line results + desc = d->strStdout; + + return d->strStdout.contains("desc"); +} + +bool QtumHwiTool::endSignTx(const QString &fingerprint, QString &psbt) +{ + Q_UNUSED(fingerprint); + + // Decode command line results + QJsonDocument jsonDocument = QJsonDocument::fromJson(d->strStdout.toUtf8()); + QVariantMap data = jsonDocument.object().toVariantMap(); + QString psbtSigned = data["psbt"].toString(); + if(!psbtSigned.isEmpty()) + { + psbt = psbtSigned; + return true; + } + + return false; +} diff --git a/src/qt/qtumhwitool.h b/src/qt/qtumhwitool.h new file mode 100644 index 0000000000..0e4e1dd1c4 --- /dev/null +++ b/src/qt/qtumhwitool.h @@ -0,0 +1,95 @@ +#ifndef QTUMHWITOOL_H +#define QTUMHWITOOL_H + +#include +#include +#include +class QtumHwiToolPriv; + +/** + * @brief The HWDevice class Hardware wallet device + */ +class HWDevice +{ +public: + HWDevice() {} + QString fingerprint; + QString serial_number; + QString type; + QString path; + QString error; +}; + +/** + * @brief The QtumHwiTool class Communicate with the Qtum Hardware Wallet Interface Tool + */ +class QtumHwiTool : public QObject +{ + Q_OBJECT +public: + /** + * @brief QtumHwiTool Constructor + * @param parent Parent object + */ + explicit QtumHwiTool(QObject *parent = nullptr); + + /** + * @brief ~QtumHwiTool Destructor + */ + ~QtumHwiTool(); + + /** + * @brief enumerate Enumerate hardware wallet devices + * @param devices List of devices + * @return success of the operation + */ + bool enumerate(QList& devices); + + /** + * @brief isConnected Check if a device is connected + * @param fingerprint Hardware wallet device fingerprint + * @return success of the operation + */ + bool isConnected(const QString& fingerprint); + + /** + * @brief getKeyPool Get the key pool for a device + * @param fingerprint Hardware wallet device fingerprint + * @param desc Address descriptors + * @return success of the operation + */ + bool getKeyPool(const QString& fingerprint, QString& desc); + + /** + * @brief signTx Sign PSBT transaction + * @param fingerprint Hardware wallet device fingerprint + * @param psbt In/Out PSBT transaction + * @return success of the operation + */ + bool signTx(const QString& fingerprint, QString& psbt); + + /** + * @brief errorMessage Get the last error message + * @return Last error message + */ + QString errorMessage(); + +Q_SIGNALS: + +public Q_SLOTS: + +private: + bool isStarted(); + void wait(); + + bool beginEnumerate(QList& devices); + bool beginGetKeyPool(const QString& fingerprint, QString& desc); + bool beginSignTx(const QString& fingerprint, QString& psbt); + bool endEnumerate(QList& devices); + bool endGetKeyPool(const QString& fingerprint, QString& desc); + bool endSignTx(const QString& fingerprint, QString& psbt); + + QtumHwiToolPriv* d; +}; + +#endif // QTUMHWITOOL_H From 4cc3b61b03c40d927705a7e256c862eb3faca8b4 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 10 Dec 2020 12:45:49 +0100 Subject: [PATCH 005/164] Select a hardware keystore device --- src/qt/hardwarekeystoredialog.cpp | 42 +++++++++++++++++++++++++++++++ src/qt/hardwarekeystoredialog.h | 31 +++++++++++++++++++++++ src/qt/qtumhwitool.cpp | 20 +++++++++++++++ src/qt/qtumhwitool.h | 20 ++++++++++++++- 4 files changed, 112 insertions(+), 1 deletion(-) diff --git a/src/qt/hardwarekeystoredialog.cpp b/src/qt/hardwarekeystoredialog.cpp index 649d377e67..d9d572b5a8 100644 --- a/src/qt/hardwarekeystoredialog.cpp +++ b/src/qt/hardwarekeystoredialog.cpp @@ -6,6 +6,8 @@ #include #include #include +#include +#include class HardwareKeystoreDialogPriv { @@ -19,13 +21,16 @@ HardwareKeystoreDialog::HardwareKeystoreDialog(const QStringList& devices, QWidg { ui->setupUi(this); + // Populate list with devices d = new HardwareKeystoreDialogPriv(); QVBoxLayout* boxLayout = new QVBoxLayout(ui->groupBoxDevices); + QButtonGroup* buttongroup = new QButtonGroup(ui->groupBoxDevices); for(QString deviceName : devices) { QRadioButton *deviceWidget = new QRadioButton(deviceName, this); boxLayout->addWidget(deviceWidget); d->devices.push_back(deviceWidget); + buttongroup->addButton(deviceWidget); } boxLayout->addStretch(1); setCurrentIndex(0); @@ -39,6 +44,7 @@ HardwareKeystoreDialog::~HardwareKeystoreDialog() int HardwareKeystoreDialog::currentIndex() const { + // Get the current device index for(int index = 0; index < d->devices.size(); index++) { if(d->devices[index]->isChecked()) @@ -49,8 +55,44 @@ int HardwareKeystoreDialog::currentIndex() const void HardwareKeystoreDialog::setCurrentIndex(int index) { + // Set the current device index if(index >=0 && index < d->devices.size()) { d->devices[index]->setChecked(true); } } + +bool HardwareKeystoreDialog::SelectDevice(QString &fingerprint, QWidget *parent) +{ + // Enumerate devices + QtumHwiTool hwiTool(parent); + QList devices; + if(hwiTool.enumerate(devices)) + { + // Get valid devices + QStringList listDeviceKey; + QStringList listDeviceValue; + for(const HWDevice& device : devices) + { + if(device.isValid()) + { + listDeviceKey << device.fingerprint; + listDeviceValue << device.toString(); + } + } + + // Select a device + if(listDeviceKey.length() > 0) + { + HardwareKeystoreDialog keystoreDialog(listDeviceValue, parent); + if(keystoreDialog.exec() == QDialog::Accepted && + keystoreDialog.currentIndex() != -1) + { + fingerprint = listDeviceKey[keystoreDialog.currentIndex()]; + return true; + } + } + } + + return false; +} diff --git a/src/qt/hardwarekeystoredialog.h b/src/qt/hardwarekeystoredialog.h index 88dea801d2..c1360c2a85 100644 --- a/src/qt/hardwarekeystoredialog.h +++ b/src/qt/hardwarekeystoredialog.h @@ -3,6 +3,7 @@ #include #include +#include namespace Ui { class HardwareKeystoreDialog; @@ -10,16 +11,46 @@ class HardwareKeystoreDialog; class HardwareKeystoreDialogPriv; +/** + * @brief The HardwareKeystoreDialog class Hardware keystore dialog + */ class HardwareKeystoreDialog : public QDialog { Q_OBJECT public: + /** + * @brief HardwareKeystoreDialog Constructor + * @param devices List of devices + * @param parent Parent widget + */ explicit HardwareKeystoreDialog(const QStringList& devices, QWidget *parent = 0); + + /** + * @brief ~HardwareKeystoreDialog Destructor + */ ~HardwareKeystoreDialog(); + + /** + * @brief currentIndex Get the currently selected index + * @return Current index + */ int currentIndex() const; + + /** + * @brief setCurrentIndex Set the currently selected index + * @param index Current index + */ void setCurrentIndex(int index); + /** + * @brief SelectDevice Select hardware keystore device + * @param fingerprint Fingerprint of the selected device + * @param parent Parent widget + * @return true: device selected; false: device not selected + */ + static bool SelectDevice(QString& fingerprint, QWidget *parent = 0); + private: Ui::HardwareKeystoreDialog *ui; HardwareKeystoreDialogPriv *d; diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 33e67357db..9f248d7b91 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -11,6 +12,11 @@ class QtumHwiToolPriv { public: + QtumHwiToolPriv() + { + toolPath = QString::fromStdString(gArgs.GetArg("-hwitoolpath", "")); + } + std::atomic fStarted{false}; QProcess process; QString strStdout; @@ -19,6 +25,19 @@ class QtumHwiToolPriv QStringList arguments; }; +HWDevice::HWDevice() +{} + +QString HWDevice::toString() const +{ + return QString("[ %1 \\ %2 \\ %3 \\ %4 ]").arg(type, model, path, fingerprint); +} + +bool HWDevice::isValid() const +{ + return fingerprint != ""; +} + QtumHwiTool::QtumHwiTool(QObject *parent) : QObject(parent) { d = new QtumHwiToolPriv(); @@ -166,6 +185,7 @@ bool QtumHwiTool::endEnumerate(QList &devices) device.type = data["type"].toString(); device.path = data["path"].toString(); device.error = data["error"].toString(); + device.model = data["model"].toString(); devices.push_back(device); } diff --git a/src/qt/qtumhwitool.h b/src/qt/qtumhwitool.h index 0e4e1dd1c4..8606ed5c7b 100644 --- a/src/qt/qtumhwitool.h +++ b/src/qt/qtumhwitool.h @@ -12,12 +12,30 @@ class QtumHwiToolPriv; class HWDevice { public: - HWDevice() {} + /** + * @brief HWDevice Constructor + */ + HWDevice(); + + /** + * @brief toString Convert the result into string + * @return String representation of the device data + */ + QString toString() const; + + /** + * @brief isValid Is device valid + * @return true: valid; false: not valid + */ + bool isValid() const; + + /// Device data QString fingerprint; QString serial_number; QString type; QString path; QString error; + QString model; }; /** From 7a5322bf1dd1d89de076bce3a5bccf907e97a2dd Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 10 Dec 2020 15:44:19 +0100 Subject: [PATCH 006/164] Add ask device --- src/qt/createwalletdialog.cpp | 2 +- src/qt/createwalletdialog.h | 2 +- src/qt/walletcontroller.cpp | 17 +++++++++++++++++ src/qt/walletcontroller.h | 2 ++ 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/qt/createwalletdialog.cpp b/src/qt/createwalletdialog.cpp index f73c10582a..1805a4434b 100644 --- a/src/qt/createwalletdialog.cpp +++ b/src/qt/createwalletdialog.cpp @@ -67,7 +67,7 @@ bool CreateWalletDialog::isMakeBlankWalletChecked() const return ui->blank_wallet_checkbox->isChecked(); } -bool CreateWalletDialog::isHardwareWalletCheckbox() const +bool CreateWalletDialog::isHardwareWalletChecked() const { return ui->hardware_wallet_checkbox->isChecked(); } diff --git a/src/qt/createwalletdialog.h b/src/qt/createwalletdialog.h index aa6b996046..5f304e4c3e 100644 --- a/src/qt/createwalletdialog.h +++ b/src/qt/createwalletdialog.h @@ -27,7 +27,7 @@ class CreateWalletDialog : public QDialog bool isEncryptWalletChecked() const; bool isDisablePrivateKeysChecked() const; bool isMakeBlankWalletChecked() const; - bool isHardwareWalletCheckbox() const; + bool isHardwareWalletChecked() const; private: Ui::CreateWalletDialog *ui; diff --git a/src/qt/walletcontroller.cpp b/src/qt/walletcontroller.cpp index 7cbb9ba31d..02bc02567b 100644 --- a/src/qt/walletcontroller.cpp +++ b/src/qt/walletcontroller.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -212,6 +213,20 @@ void CreateWalletActivity::askPassphrase() }); } +void CreateWalletActivity::askDevice() +{ + QTimer::singleShot(500, worker(), [this] { + if(HardwareKeystoreDialog::SelectDevice(m_fingerprint, m_parent_widget)) + { + createWallet(); + } + else + { + Q_EMIT finished(); + } + }); +} + void CreateWalletActivity::createWallet() { showProgressDialog(tr("Creating Wallet %1...").arg(m_create_wallet_dialog->walletName().toHtmlEscaped())); @@ -265,6 +280,8 @@ void CreateWalletActivity::create() connect(m_create_wallet_dialog, &QDialog::accepted, [this] { if (m_create_wallet_dialog->isEncryptWalletChecked()) { askPassphrase(); + } else if (m_create_wallet_dialog->isHardwareWalletChecked()) { + askDevice(); } else { createWallet(); } diff --git a/src/qt/walletcontroller.h b/src/qt/walletcontroller.h index 53a7852abb..86fc03e265 100644 --- a/src/qt/walletcontroller.h +++ b/src/qt/walletcontroller.h @@ -124,10 +124,12 @@ class CreateWalletActivity : public WalletControllerActivity private: void askPassphrase(); + void askDevice(); void createWallet(); void finish(); SecureString m_passphrase; + QString m_fingerprint; CreateWalletDialog* m_create_wallet_dialog{nullptr}; AskPassphraseDialog* m_passphrase_dialog{nullptr}; }; From 72787766fb4e044f09b7aac4e0f380ec8d3cfd2f Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 10 Dec 2020 16:01:11 +0100 Subject: [PATCH 007/164] Add get hwi tool path util method --- src/qt/guiutil.cpp | 5 +++++ src/qt/guiutil.h | 6 ++++++ src/qt/hardwarekeystoredialog.cpp | 3 ++- src/qt/qtumhwitool.cpp | 8 ++++++-- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp index 718af95bac..bbd2fc0d91 100644 --- a/src/qt/guiutil.cpp +++ b/src/qt/guiutil.cpp @@ -940,4 +940,9 @@ QString cutString(const QString &text, int length) return text; } +QString getHwiToolPath() +{ + return QString::fromStdString(gArgs.GetArg("-hwitoolpath", "")); +} + } // namespace GUIUtil diff --git a/src/qt/guiutil.h b/src/qt/guiutil.h index 08d8011dac..45e85a0300 100644 --- a/src/qt/guiutil.h +++ b/src/qt/guiutil.h @@ -283,6 +283,12 @@ namespace GUIUtil QString cutString(const QString& text, int length); + /** + * @brief getHwiToolPath Get HWI tool path + * @return Path to HWI tool + */ + QString getHwiToolPath(); + } // namespace GUIUtil #endif // BITCOIN_QT_GUIUTIL_H diff --git a/src/qt/hardwarekeystoredialog.cpp b/src/qt/hardwarekeystoredialog.cpp index d9d572b5a8..64d24fe8c2 100644 --- a/src/qt/hardwarekeystoredialog.cpp +++ b/src/qt/hardwarekeystoredialog.cpp @@ -4,10 +4,11 @@ #include #include +#include + #include #include #include -#include class HardwareKeystoreDialogPriv { diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 9f248d7b91..25e6dbe9ae 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -1,5 +1,9 @@ +#if defined(HAVE_CONFIG_H) +#include +#endif + #include -#include +#include #include #include @@ -14,7 +18,7 @@ class QtumHwiToolPriv public: QtumHwiToolPriv() { - toolPath = QString::fromStdString(gArgs.GetArg("-hwitoolpath", "")); + toolPath = GUIUtil::getHwiToolPath(); } std::atomic fStarted{false}; From 99354bbab66305063fd0b93bf66d7448d19a7249 Mon Sep 17 00:00:00 2001 From: Toni Markov Date: Fri, 11 Dec 2020 09:26:41 +0100 Subject: [PATCH 008/164] Add option to set HWI tool path --- src/init.cpp | 1 + src/qt/forms/optionsdialog.ui | 153 +++++++++++++++++++--------------- src/qt/optionsdialog.cpp | 17 ++++ src/qt/optionsdialog.h | 1 + src/qt/optionsmodel.cpp | 19 +++++ src/qt/optionsmodel.h | 1 + 6 files changed, 126 insertions(+), 66 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index 9ee63ce0ff..227e339164 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -466,6 +466,7 @@ void SetupServerArgs() gArgs.AddArg("-torpassword=", "Tor control port password (default: empty)", ArgsManager::ALLOW_ANY | ArgsManager::SENSITIVE, OptionsCategory::CONNECTION); gArgs.AddArg("-dgpstorage", "Receiving data from DGP via storage (default: -dgpevm)", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); gArgs.AddArg("-dgpevm", "Receiving data from DGP via a contract call (default: -dgpevm)", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); + gArgs.AddArg("-hwitoolpath=", "Specify HWI tool path", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS); #ifdef USE_UPNP #if USE_UPNP diff --git a/src/qt/forms/optionsdialog.ui b/src/qt/forms/optionsdialog.ui index ebb4c66ec9..302b9b90a9 100644 --- a/src/qt/forms/optionsdialog.ui +++ b/src/qt/forms/optionsdialog.ui @@ -7,7 +7,7 @@ 0 0 832 - 471 + 541 @@ -69,33 +69,87 @@ 10 - - + + - Reverting this setting requires re-downloading the entire blockchain. + Reserve Qt::PlainText + + threadsScriptVerif + - - - - Number of script &verification threads - - - Qt::PlainText + + + + Disables some advanced features but all blocks will still be fully validated. Reverting this setting requires re-downloading the entire blockchain. Actual disk usage may be somewhat higher. - - threadsScriptVerif + + Prune &block storage to - - + + + + + + + + + GB + + + Qt::PlainText + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Reserve amount that will not be used for staking + + + + + + + Qt::Horizontal + + + + 40 + 0 + + + + + + + + - Reserve + Number of script &verification threads Qt::PlainText @@ -155,29 +209,15 @@ - - - - - - Reserve amount that will not be used for staking - - - - - - - Qt::Horizontal - - - - 40 - 0 - - - - - + + + + Reverting this setting requires re-downloading the entire blockchain. + + + Qt::PlainText + + @@ -209,44 +249,25 @@ - - - - Disables some advanced features but all blocks will still be fully validated. Reverting this setting requires re-downloading the entire blockchain. Actual disk usage may be somewhat higher. - + + - Prune &block storage to + HWI tool path - - + + - + - + - GB - - - Qt::PlainText + ... - - - - Qt::Horizontal - - - - 40 - 20 - - - - diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp index 124c201aaa..0a9bbfe883 100644 --- a/src/qt/optionsdialog.cpp +++ b/src/qt/optionsdialog.cpp @@ -98,6 +98,9 @@ OptionsDialog::OptionsDialog(QWidget *parent, bool enableWallet) : ui->reserveBalanceLabel->setVisible(false); ui->reserveBalance->setVisible(false); ui->superStaking->setVisible(false); + ui->txtHWIToolPath->setVisible(false); + ui->toolHWIPath->setVisible(false); + ui->HWIToolLabel->setVisible(false); } /* Display elements init */ @@ -210,6 +213,7 @@ void OptionsDialog::setModel(OptionsModel *_model) connect(ui->superStaking, &QCheckBox::clicked, this, &OptionsDialog::showRestartWarning); connect(ui->threadsScriptVerif, static_cast(&QSpinBox::valueChanged), this, &OptionsDialog::showRestartWarning); connect(ui->reserveBalance, SIGNAL(valueChanged()), this, SLOT(showRestartWarning())); + connect(ui->txtHWIToolPath, SIGNAL(textChanged(const QString &)), this, SLOT(showRestartWarning())); /* Wallet */ connect(ui->spendZeroConfChange, &QCheckBox::clicked, this, &OptionsDialog::showRestartWarning); connect(ui->useChangeAddress, &QCheckBox::clicked, this, &OptionsDialog::showRestartWarning); @@ -244,6 +248,7 @@ void OptionsDialog::setMapper() mapper->addMapping(ui->logEvents, OptionsModel::LogEvents); mapper->addMapping(ui->superStaking, OptionsModel::SuperStaking); mapper->addMapping(ui->reserveBalance, OptionsModel::ReserveBalance); + mapper->addMapping(ui->txtHWIToolPath, OptionsModel::HWIToolPath); /* Wallet */ mapper->addMapping(ui->spendZeroConfChange, OptionsModel::SpendZeroConfChange); @@ -342,6 +347,18 @@ void OptionsDialog::on_cancelButton_clicked() reject(); } +void OptionsDialog::on_toolHWIPath_clicked() +{ + QString filename = GUIUtil::getOpenFileName(this, + tr("Select HWI tool path"), QString(), + tr("HWI tool (*.exe *.py)"), NULL); + + if (filename.isEmpty()) + return; + + ui->txtHWIToolPath->setText(filename); +} + void OptionsDialog::on_hideTrayIcon_stateChanged(int fState) { if(fState) diff --git a/src/qt/optionsdialog.h b/src/qt/optionsdialog.h index 9bc1c8ae4f..5bf831933d 100644 --- a/src/qt/optionsdialog.h +++ b/src/qt/optionsdialog.h @@ -56,6 +56,7 @@ private Q_SLOTS: void on_openBitcoinConfButton_clicked(); void on_okButton_clicked(); void on_cancelButton_clicked(); + void on_toolHWIPath_clicked(); void on_hideTrayIcon_stateChanged(int fState); diff --git a/src/qt/optionsmodel.cpp b/src/qt/optionsmodel.cpp index 8d83d81558..bfaa4ce388 100644 --- a/src/qt/optionsmodel.cpp +++ b/src/qt/optionsmodel.cpp @@ -219,6 +219,14 @@ void OptionsModel::Init(bool resetSettings) settings.setValue("Theme", ""); theme = settings.value("Theme").toString(); + +#ifdef ENABLE_WALLET + if (!settings.contains("HWIToolPath")) + settings.setValue("HWIToolPath", ""); + + if (!m_node.softSetArg("-hwitoolpath", settings.value("HWIToolPath").toString().toStdString())) + addOverriddenOption("-hwitoolpath"); +#endif } /** Helper function to copy contents from one QSettings to another. @@ -406,6 +414,10 @@ QVariant OptionsModel::data(const QModelIndex & index, int role) const return settings.value("fCheckForUpdates"); case Theme: return settings.value("Theme"); +#ifdef ENABLE_WALLET + case HWIToolPath: + return settings.value("HWIToolPath"); +#endif default: return QVariant(); } @@ -601,6 +613,13 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in setRestartRequired(true); } break; +#ifdef ENABLE_WALLET + case HWIToolPath: + if (settings.value("HWIToolPath") != value) { + settings.setValue("HWIToolPath", value); + } + break; +#endif default: break; } diff --git a/src/qt/optionsmodel.h b/src/qt/optionsmodel.h index 1aaa068db9..05b527c424 100644 --- a/src/qt/optionsmodel.h +++ b/src/qt/optionsmodel.h @@ -70,6 +70,7 @@ class OptionsModel : public QAbstractListModel CheckForUpdates, // bool ReserveBalance, // CAmount Theme, // QString + HWIToolPath, // QString OptionIDRowCount, }; From 3aa53877ef8df8c83335e45bc967391f4d75d8aa Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 11 Dec 2020 12:30:30 +0100 Subject: [PATCH 009/164] Check if HWI tool exist --- src/qt/guiconstants.h | 3 +++ src/qt/walletcontroller.cpp | 36 ++++++++++++++++++++++++++---------- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/qt/guiconstants.h b/src/qt/guiconstants.h index 05c0d38dac..b59ab167c2 100644 --- a/src/qt/guiconstants.h +++ b/src/qt/guiconstants.h @@ -61,4 +61,7 @@ static constexpr int DEFAULT_PRUNE_TARGET_GB{2}; /* Testnet qtum explorer uri */ #define QTUM_INFO_TESTNET "%2" +/* Hardware wallet interface uri */ +#define QTUM_HWI_TOOL "HWI Tool" + #endif // BITCOIN_QT_GUICONSTANTS_H diff --git a/src/qt/walletcontroller.cpp b/src/qt/walletcontroller.cpp index 02bc02567b..812cc82dea 100644 --- a/src/qt/walletcontroller.cpp +++ b/src/qt/walletcontroller.cpp @@ -24,6 +24,7 @@ #include #include #include +#include WalletController::WalletController(interfaces::Node& node, const PlatformStyle* platform_style, OptionsModel* options_model, QObject* parent) : QObject(parent) @@ -215,16 +216,31 @@ void CreateWalletActivity::askPassphrase() void CreateWalletActivity::askDevice() { - QTimer::singleShot(500, worker(), [this] { - if(HardwareKeystoreDialog::SelectDevice(m_fingerprint, m_parent_widget)) - { - createWallet(); - } - else - { - Q_EMIT finished(); - } - }); + QString hwiToolPath = GUIUtil::getHwiToolPath(); + if(QFile::exists(hwiToolPath)) + { + QTimer::singleShot(500, worker(), [this] { + if(HardwareKeystoreDialog::SelectDevice(m_fingerprint, m_parent_widget)) + { + createWallet(); + } + else + { + Q_EMIT finished(); + } + }); + } + else + { + QMessageBox msgBox(m_parent_widget); + msgBox.setWindowTitle(tr("HWI tool not found")); + msgBox.setTextFormat(Qt::RichText); + msgBox.setText(tr("HWI tool not found at path \"%1\".
Please download it from %2.").arg(hwiToolPath, QTUM_HWI_TOOL)); + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.exec(); + + Q_EMIT finished(); + } } void CreateWalletActivity::createWallet() From cca946462f3ea6f6f21a29fffd78b23e168e6418 Mon Sep 17 00:00:00 2001 From: Toni Markov Date: Fri, 11 Dec 2020 12:59:14 +0100 Subject: [PATCH 010/164] Update check box states in create wallet dialog --- src/qt/createwalletdialog.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/qt/createwalletdialog.cpp b/src/qt/createwalletdialog.cpp index 1805a4434b..b75981747c 100644 --- a/src/qt/createwalletdialog.cpp +++ b/src/qt/createwalletdialog.cpp @@ -38,7 +38,20 @@ CreateWalletDialog::CreateWalletDialog(QWidget* parent) : }); connect(ui->hardware_wallet_checkbox, &QCheckBox::toggled, [this](bool checked) { - if(checked) ui->encrypt_wallet_checkbox->setChecked(false); + // Disable and uncheck encrypt_wallet_checkbox when isHardwareWalletChecked is true, + // enable and check it if isHardwareWalletChecked is false + ui->encrypt_wallet_checkbox->setChecked(!checked); + ui->encrypt_wallet_checkbox->setEnabled(!checked); + + // Disable disable_privkeys_checkbox + // and check it if isHardwareWalletChecked is true or uncheck if isHardwareWalletChecked is false + ui->disable_privkeys_checkbox->setEnabled(false); + ui->disable_privkeys_checkbox->setChecked(checked); + + // Disable and check blank_wallet_checkbox if isHardwareWalletChecked is true and + // enable and uncheck it if isHardwareWalletChecked is false + ui->blank_wallet_checkbox->setEnabled(!checked); + ui->blank_wallet_checkbox->setChecked(checked); }); } From 856ea147d95301b34e0976f6034d14d1ed580b09 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 25 Dec 2020 11:04:54 +0100 Subject: [PATCH 011/164] Restart the node when the hwi tool path is changed --- src/qt/optionsmodel.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/qt/optionsmodel.cpp b/src/qt/optionsmodel.cpp index bfaa4ce388..30a0a46601 100644 --- a/src/qt/optionsmodel.cpp +++ b/src/qt/optionsmodel.cpp @@ -617,6 +617,7 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in case HWIToolPath: if (settings.value("HWIToolPath") != value) { settings.setValue("HWIToolPath", value); + setRestartRequired(true); } break; #endif From 9e411c7136c81cf42385ad888970a00e9e4637b7 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 25 Dec 2020 11:51:42 +0100 Subject: [PATCH 012/164] Add flag has hardware wallet support --- src/chainparams.cpp | 3 +++ src/chainparams.h | 2 ++ src/qt/createwalletdialog.cpp | 2 ++ src/qt/optionsdialog.cpp | 7 +++++++ 4 files changed, 14 insertions(+) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index fc920fefb3..28a77b84cd 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -157,6 +157,7 @@ class CMainParams : public CChainParams { fMineBlocksOnDemand = false; m_is_test_chain = false; m_is_mockable_chain = false; + fHasHardwareWalletSupport = false; checkpointData = { { @@ -286,6 +287,7 @@ class CTestNetParams : public CChainParams { fMineBlocksOnDemand = false; m_is_test_chain = true; m_is_mockable_chain = false; + fHasHardwareWalletSupport = false; checkpointData = { { @@ -401,6 +403,7 @@ class CRegTestParams : public CChainParams { fMineBlocksOnDemand = true; m_is_test_chain = true; m_is_mockable_chain = true; + fHasHardwareWalletSupport = true; checkpointData = { { diff --git a/src/chainparams.h b/src/chainparams.h index 0318b8923e..8f28783d42 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -104,6 +104,7 @@ class CChainParams void UpdatePowNoRetargeting(bool fValue); void UpdatePoSNoRetargeting(bool fValue); void UpdateMuirGlacierHeight(int nHeight); + bool HasHardwareWalletSupport() const { return fHasHardwareWalletSupport; } protected: dev::eth::Network GetEVMNetwork() const; CChainParams() {} @@ -127,6 +128,7 @@ class CChainParams bool m_is_mockable_chain; CCheckpointData checkpointData; ChainTxData chainTxData; + bool fHasHardwareWalletSupport; }; /** diff --git a/src/qt/createwalletdialog.cpp b/src/qt/createwalletdialog.cpp index b75981747c..2f0914113f 100644 --- a/src/qt/createwalletdialog.cpp +++ b/src/qt/createwalletdialog.cpp @@ -8,6 +8,7 @@ #include #include +#include #include @@ -19,6 +20,7 @@ CreateWalletDialog::CreateWalletDialog(QWidget* parent) : ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Create")); ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); ui->wallet_name_line_edit->setFocus(Qt::ActiveWindowFocusReason); + ui->hardware_wallet_checkbox->setVisible(::Params().HasHardwareWalletSupport()); connect(ui->wallet_name_line_edit, &QLineEdit::textEdited, [this](const QString& text) { ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!text.isEmpty()); diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp index 0a9bbfe883..3caa874c24 100644 --- a/src/qt/optionsdialog.cpp +++ b/src/qt/optionsdialog.cpp @@ -19,6 +19,7 @@ #include #include // for -dbcache defaults #include +#include #include #include @@ -102,6 +103,12 @@ OptionsDialog::OptionsDialog(QWidget *parent, bool enableWallet) : ui->toolHWIPath->setVisible(false); ui->HWIToolLabel->setVisible(false); } + else { + bool fHasHardwareWalletSupport = ::Params().HasHardwareWalletSupport(); + ui->txtHWIToolPath->setVisible(fHasHardwareWalletSupport); + ui->toolHWIPath->setVisible(fHasHardwareWalletSupport); + ui->HWIToolLabel->setVisible(fHasHardwareWalletSupport); + } /* Display elements init */ QDir translations(":translations"); From f2adab9d0b717f697af407469c958637b2642136 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 25 Dec 2020 12:30:50 +0100 Subject: [PATCH 013/164] Add wallet model set and get fingerprint --- src/qt/walletmodel.cpp | 10 ++++++++++ src/qt/walletmodel.h | 7 +++++++ 2 files changed, 17 insertions(+) diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index 984f159637..6acd9e9b9d 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -829,3 +829,13 @@ void WalletModel::checkCoinAddresses() { updateCoinAddresses = true; } + +QString WalletModel::getFingerprint() const +{ + return fingerprint; +} + +void WalletModel::setFingerprint(const QString &value) +{ + fingerprint = value; +} diff --git a/src/qt/walletmodel.h b/src/qt/walletmodel.h index 901375b4af..d78ff77774 100644 --- a/src/qt/walletmodel.h +++ b/src/qt/walletmodel.h @@ -176,6 +176,11 @@ class WalletModel : public QObject uint64_t getStakeWeight(); AddressTableModel* getAddressTableModel() const { return addressTableModel; } + + // Get or set selected hardware device fingerprint (only for hardware wallet applicable) + QString getFingerprint() const; + void setFingerprint(const QString &value); + private: std::unique_ptr m_wallet; std::unique_ptr m_handler_unload; @@ -218,6 +223,8 @@ class WalletModel : public QObject std::atomic updateStakeWeight; std::atomic updateCoinAddresses; + QString fingerprint; + QThread t; WalletWorker *worker; From 2e03a8b50f42f5fcf0fb25045f5781620d71fb0b Mon Sep 17 00:00:00 2001 From: Toni Markov Date: Fri, 25 Dec 2020 14:06:18 +0100 Subject: [PATCH 014/164] Add hardware sing transaction dialog --- src/Makefile.qt.include | 4 + src/qt/forms/hardwaresigntxdialog.ui | 157 +++++++++++++++++++++++++++ src/qt/hardwaresigntxdialog.cpp | 19 ++++ src/qt/hardwaresigntxdialog.h | 25 +++++ 4 files changed, 205 insertions(+) create mode 100644 src/qt/forms/hardwaresigntxdialog.ui create mode 100644 src/qt/hardwaresigntxdialog.cpp create mode 100644 src/qt/hardwaresigntxdialog.h diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index 1bfbed4fd2..4f00fc3886 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -27,6 +27,7 @@ QT_FORMS_UI = \ qt/forms/editcontractinfodialog.ui \ qt/forms/editsuperstakerdialog.ui \ qt/forms/hardwarekeystoredialog.ui \ + qt/forms/hardwaresigntxdialog.ui \ qt/forms/helpmessagedialog.ui \ qt/forms/intro.ui \ qt/forms/modaloverlay.ui \ @@ -94,6 +95,7 @@ QT_MOC_CPP = \ qt/moc_editcontractinfodialog.cpp \ qt/moc_editsuperstakerdialog.cpp \ qt/moc_hardwarekeystoredialog.cpp \ + qt/moc_hardwaresigntxdialog.cpp \ qt/moc_guiutil.cpp \ qt/moc_intro.cpp \ qt/moc_macdockiconhandler.cpp \ @@ -222,6 +224,7 @@ BITCOIN_QT_H = \ qt/eventlog.h \ qt/execrpccommand.h \ qt/hardwarekeystoredialog.h \ + qt/hardwaresigntxdialog.h \ qt/guiconstants.h \ qt/guiutil.h \ qt/intro.h \ @@ -449,6 +452,7 @@ BITCOIN_QT_WALLET_CPP = \ qt/editcontractinfodialog.cpp \ qt/editsuperstakerdialog.cpp \ qt/hardwarekeystoredialog.cpp \ + qt/hardwaresigntxdialog.cpp \ qt/openuridialog.cpp \ qt/overviewpage.cpp \ qt/paymentserver.cpp \ diff --git a/src/qt/forms/hardwaresigntxdialog.ui b/src/qt/forms/hardwaresigntxdialog.ui new file mode 100644 index 0000000000..4a53ad120b --- /dev/null +++ b/src/qt/forms/hardwaresigntxdialog.ui @@ -0,0 +1,157 @@ + + + HardwareSignTxDialog + + + + 0 + 0 + 607 + 396 + + + + Sign transaction with hardware + + + + 0 + + + 0 + + + 0 + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 10 + + + + + + + + 30 + + + 30 + + + + + Transaction data + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 10 + + + + + + + + Transaction details + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 13 + + + + + + + + + 30 + + + 15 + + + 30 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Sign + + + + + + + Send + + + + + + + Cancel + + + + + + + + + + + diff --git a/src/qt/hardwaresigntxdialog.cpp b/src/qt/hardwaresigntxdialog.cpp new file mode 100644 index 0000000000..e541b1651a --- /dev/null +++ b/src/qt/hardwaresigntxdialog.cpp @@ -0,0 +1,19 @@ +#include +#include + +HardwareSignTxDialog::HardwareSignTxDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::HardwareSignTxDialog) +{ + ui->setupUi(this); +} + +HardwareSignTxDialog::~HardwareSignTxDialog() +{ + delete ui; +} + +void HardwareSignTxDialog::on_cancelButton_clicked() +{ + QDialog::reject(); +} diff --git a/src/qt/hardwaresigntxdialog.h b/src/qt/hardwaresigntxdialog.h new file mode 100644 index 0000000000..8c16cd961c --- /dev/null +++ b/src/qt/hardwaresigntxdialog.h @@ -0,0 +1,25 @@ +#ifndef HARDWARESIGNTXDIALOG_H +#define HARDWARESIGNTXDIALOG_H + +#include + +namespace Ui { +class HardwareSignTxDialog; +} + +class HardwareSignTxDialog : public QDialog +{ + Q_OBJECT + +public: + explicit HardwareSignTxDialog(QWidget *parent = nullptr); + ~HardwareSignTxDialog(); + +private Q_SLOTS: + void on_cancelButton_clicked(); + +private: + Ui::HardwareSignTxDialog *ui; +}; +HARDWARESIGNTXDIALOG_H +#endif // HARDWARESIGNTX_H From f49ff84c7f536abe9da59bebbd99ce2fc8fa4863 Mon Sep 17 00:00:00 2001 From: Toni Markov Date: Fri, 25 Dec 2020 16:23:53 +0100 Subject: [PATCH 015/164] Add hardware device dialog --- src/Makefile.qt.include | 4 + src/qt/forms/hardwaredevicedialog.ui | 189 +++++++++++++++++++++++++++ src/qt/hardwaredevicedialog.cpp | 19 +++ src/qt/hardwaredevicedialog.h | 25 ++++ src/qt/hardwaresigntxdialog.h | 4 +- 5 files changed, 239 insertions(+), 2 deletions(-) create mode 100644 src/qt/forms/hardwaredevicedialog.ui create mode 100644 src/qt/hardwaredevicedialog.cpp create mode 100644 src/qt/hardwaredevicedialog.h diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index 4f00fc3886..3dbd45ee69 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -26,6 +26,7 @@ QT_FORMS_UI = \ qt/forms/editaddressdialog.ui \ qt/forms/editcontractinfodialog.ui \ qt/forms/editsuperstakerdialog.ui \ + qt/forms/hardwaredevicedialog.ui \ qt/forms/hardwarekeystoredialog.ui \ qt/forms/hardwaresigntxdialog.ui \ qt/forms/helpmessagedialog.ui \ @@ -94,6 +95,7 @@ QT_MOC_CPP = \ qt/moc_editaddressdialog.cpp \ qt/moc_editcontractinfodialog.cpp \ qt/moc_editsuperstakerdialog.cpp \ + qt/moc_hardwaredevicedialog.cpp \ qt/moc_hardwarekeystoredialog.cpp \ qt/moc_hardwaresigntxdialog.cpp \ qt/moc_guiutil.cpp \ @@ -223,6 +225,7 @@ BITCOIN_QT_H = \ qt/editsuperstakerdialog.h \ qt/eventlog.h \ qt/execrpccommand.h \ + qt/hardwaredevicedialog.h \ qt/hardwarekeystoredialog.h \ qt/hardwaresigntxdialog.h \ qt/guiconstants.h \ @@ -451,6 +454,7 @@ BITCOIN_QT_WALLET_CPP = \ qt/editaddressdialog.cpp \ qt/editcontractinfodialog.cpp \ qt/editsuperstakerdialog.cpp \ + qt/hardwaredevicedialog.cpp \ qt/hardwarekeystoredialog.cpp \ qt/hardwaresigntxdialog.cpp \ qt/openuridialog.cpp \ diff --git a/src/qt/forms/hardwaredevicedialog.ui b/src/qt/forms/hardwaredevicedialog.ui new file mode 100644 index 0000000000..501ec097fc --- /dev/null +++ b/src/qt/forms/hardwaredevicedialog.ui @@ -0,0 +1,189 @@ + + + HardwareDeviceDialog + + + + 0 + 0 + 615 + 471 + + + + Search for hardware keystore + + + + 0 + + + 0 + + + 0 + + + + + 12 + + + 30 + + + 30 + + + + + + 75 + true + + + + Hardware keystore + + + + + + + 10 + + + + + No hardware device detected. +to triger a rescan press 'Next' + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 10 + + + + + + + + On linux, you might have to add a new permission to your udev rules. + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 10 + + + + + + + + Debug message + + + + + + + true + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 5 + + + + + + + + + 30 + + + 15 + + + 30 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Cancel + + + + + + + Next + + + + + + + + + + + diff --git a/src/qt/hardwaredevicedialog.cpp b/src/qt/hardwaredevicedialog.cpp new file mode 100644 index 0000000000..6d6ee8c163 --- /dev/null +++ b/src/qt/hardwaredevicedialog.cpp @@ -0,0 +1,19 @@ +#include +#include + +HardwareDeviceDialog::HardwareDeviceDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::HardwareDeviceDialog) +{ + ui->setupUi(this); +} + +HardwareDeviceDialog::~HardwareDeviceDialog() +{ + delete ui; +} + +void HardwareDeviceDialog::on_cancelButton_clicked() +{ + QDialog::reject(); +} diff --git a/src/qt/hardwaredevicedialog.h b/src/qt/hardwaredevicedialog.h new file mode 100644 index 0000000000..a8c411239f --- /dev/null +++ b/src/qt/hardwaredevicedialog.h @@ -0,0 +1,25 @@ +#ifndef HARDWAREDEVICEDIALOG_H +#define HARDWAREDEVICEDIALOG_H + +#include + +namespace Ui { +class HardwareDeviceDialog; +} + +class HardwareDeviceDialog : public QDialog +{ + Q_OBJECT + +public: + explicit HardwareDeviceDialog(QWidget *parent = nullptr); + ~HardwareDeviceDialog(); + +private Q_SLOTS: + void on_cancelButton_clicked(); + +private: + Ui::HardwareDeviceDialog *ui; +}; + +#endif // HARDWAREDEVICEDIALOG_H diff --git a/src/qt/hardwaresigntxdialog.h b/src/qt/hardwaresigntxdialog.h index 8c16cd961c..0a671857c3 100644 --- a/src/qt/hardwaresigntxdialog.h +++ b/src/qt/hardwaresigntxdialog.h @@ -21,5 +21,5 @@ private Q_SLOTS: private: Ui::HardwareSignTxDialog *ui; }; -HARDWARESIGNTXDIALOG_H -#endif // HARDWARESIGNTX_H + +#endif // HARDWARESIGNTXDIALOG_H From 89446504671b5b128ebf4c71f79597151b233aec Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 25 Dec 2020 16:30:29 +0100 Subject: [PATCH 016/164] Add HWI tool methods for working with the blockchain --- src/qt/qtumhwitool.cpp | 137 ++++++++++++++++++++++++++++++++++++++++- src/qt/qtumhwitool.h | 40 ++++++++++++ 2 files changed, 175 insertions(+), 2 deletions(-) diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 25e6dbe9ae..0141e76da2 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -4,21 +4,39 @@ #include #include +#include +#include +#include #include #include #include #include #include +#include #include +static const QString PARAM_START_HEIGHT = "start_height"; +static const QString PARAM_STOP_HEIGHT = "stop_height"; +static const QString PARAM_REQUESTS = "requests"; +static const QString PARAM_PSBT = "psbt"; +static const QString PARAM_HEXTX = "hextx"; + class QtumHwiToolPriv { public: - QtumHwiToolPriv() + QtumHwiToolPriv(QObject *parent) { toolPath = GUIUtil::getHwiToolPath(); + QStringList optionalRescan = QStringList() << PARAM_START_HEIGHT << PARAM_STOP_HEIGHT; + cmdRescan = new ExecRPCCommand("rescanblockchain", QStringList(), optionalRescan, QMap(), parent); + QStringList mandatoryImport = QStringList() << PARAM_REQUESTS; + cmdImport = new ExecRPCCommand("importmulti", mandatoryImport, QStringList(), QMap(), parent); + QStringList mandatoryFinalize = QStringList() << PARAM_PSBT; + cmdFinalize = new ExecRPCCommand("finalizepsbt", mandatoryFinalize, QStringList(), QMap(), parent); + QStringList mandatorySend = QStringList() << PARAM_HEXTX; + cmdSend = new ExecRPCCommand("finalizepsbt", mandatorySend, QStringList(), QMap(), parent); } std::atomic fStarted{false}; @@ -27,6 +45,12 @@ class QtumHwiToolPriv QString strStderr; QString toolPath; QStringList arguments; + + ExecRPCCommand* cmdRescan = 0; + ExecRPCCommand* cmdImport = 0; + ExecRPCCommand* cmdFinalize = 0; + ExecRPCCommand* cmdSend = 0; + WalletModel* model = 0; }; HWDevice::HWDevice() @@ -44,7 +68,7 @@ bool HWDevice::isValid() const QtumHwiTool::QtumHwiTool(QObject *parent) : QObject(parent) { - d = new QtumHwiToolPriv(); + d = new QtumHwiToolPriv(this); } QtumHwiTool::~QtumHwiTool() @@ -222,3 +246,112 @@ bool QtumHwiTool::endSignTx(const QString &fingerprint, QString &psbt) return false; } + +bool QtumHwiTool::rescanBlockchain(int startHeight, int stopHeight) +{ + if(!d->model) return false; + + // Add params for RPC + QMap lstParams; + QVariant result; + QString resultJson; + ExecRPCCommand::appendParam(lstParams, PARAM_START_HEIGHT, QString::number(startHeight)); + if(stopHeight > -1) + { + ExecRPCCommand::appendParam(lstParams, PARAM_STOP_HEIGHT, QString::number(stopHeight)); + } + + // Exec RPC + if(!execRPC(d->cmdRescan, lstParams, result, resultJson)) + return false; + + // Parse results + QVariantMap variantMap = result.toMap(); + int resStartHeight = variantMap.value(PARAM_START_HEIGHT).toInt(); + int resStopHeight = variantMap.value(PARAM_STOP_HEIGHT).toInt(); + + return resStartHeight < resStopHeight; +} + +bool QtumHwiTool::importMulti(const QString &desc) +{ + if(!d->model) return false; + + // Add params for RPC + QMap lstParams; + QVariant result; + QString resultJson; + ExecRPCCommand::appendParam(lstParams, PARAM_REQUESTS, desc); + + // Exec RPC + if(!execRPC(d->cmdImport, lstParams, result, resultJson)) + return false; + + // Parse results + int countSuccess = 0; + QVariantList variantList = result.toList(); + for(const QVariant& item : variantList) + { + QVariantMap variantMap = item.toMap(); + if(variantMap.value("success").toBool()) + countSuccess++; + } + + return countSuccess > 0; +} + +bool QtumHwiTool::finalizePsbt(const QString &psbt, QString &hexTx, bool &complete) +{ + if(!d->model) return false; + + // Add params for RPC + QMap lstParams; + QVariant result; + QString resultJson; + ExecRPCCommand::appendParam(lstParams, PARAM_PSBT, psbt); + + // Exec RPC + if(!execRPC(d->cmdFinalize, lstParams, result, resultJson)) + return false; + + // Parse results + QVariantMap variantMap = result.toMap(); + hexTx = variantMap.value("hex").toString(); + complete = variantMap.value("complete").toBool(); + + return true; +} + +bool QtumHwiTool::sendRawTransaction(const QString &hexTx) +{ + if(!d->model) return false; + + // Add params for RPC + QMap lstParams; + QVariant result; + QString resultStr; + ExecRPCCommand::appendParam(lstParams, PARAM_HEXTX, hexTx); + + // Exec RPC + if(!execRPC(d->cmdSend, lstParams, result, resultStr)) + return false; + + // Parse results + std::string strHash = resultStr.toStdString(); + + return strHash.length() == 64 && IsHex(strHash); +} + +void QtumHwiTool::setModel(WalletModel *model) +{ + d->model = model; +} + +bool QtumHwiTool::execRPC(ExecRPCCommand *cmd, const QMap &lstParams, QVariant &result, QString &resultJson) +{ + d->strStderr.clear(); + if(!cmd->exec(d->model->node(), d->model, lstParams, result, resultJson, d->strStderr)) + return false; + + return true; +} diff --git a/src/qt/qtumhwitool.h b/src/qt/qtumhwitool.h index 8606ed5c7b..cc5ec235c7 100644 --- a/src/qt/qtumhwitool.h +++ b/src/qt/qtumhwitool.h @@ -5,6 +5,8 @@ #include #include class QtumHwiToolPriv; +class WalletModel; +class ExecRPCCommand; /** * @brief The HWDevice class Hardware wallet device @@ -86,12 +88,49 @@ class QtumHwiTool : public QObject */ bool signTx(const QString& fingerprint, QString& psbt); + /** + * @brief rescanBlockchain Rescan blockchain + * @param startHeight Start height + * @param stopHeight Stop height + * @return success of the operation + */ + bool rescanBlockchain(int startHeight =0, int stopHeight =-1); + + /** + * @brief importMulti Import address descriptions + * @param desc Address descriptions + * @return success of the operation + */ + bool importMulti(const QString& desc); + + /** + * @brief finalizePsbt Finalize psbt + * @param psbt Psbt transaction + * @param hexTx Hex transaction + * @param complete Is the set of signatures complete + * @return success of the operation + */ + bool finalizePsbt(const QString& psbt, QString& hexTx, bool & complete); + + /** + * @brief sendRawTransaction Send raw transaction + * @param hexTx Hex transaction + * @return success of the operation + */ + bool sendRawTransaction(const QString& hexTx); + /** * @brief errorMessage Get the last error message * @return Last error message */ QString errorMessage(); + /** + * @brief setModel Set wallet model + * @param model Wallet model + */ + void setModel(WalletModel *model); + Q_SIGNALS: public Q_SLOTS: @@ -106,6 +145,7 @@ public Q_SLOTS: bool endEnumerate(QList& devices); bool endGetKeyPool(const QString& fingerprint, QString& desc); bool endSignTx(const QString& fingerprint, QString& psbt); + bool execRPC(ExecRPCCommand* cmd, const QMap& lstParams, QVariant& result, QString& resultJson); QtumHwiToolPriv* d; }; From 93bad933382c2beaf6eb31654a653bbee00a130e Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 28 Dec 2020 11:06:30 +0100 Subject: [PATCH 017/164] Add sign tx hardware action --- src/qt/bitcoingui.cpp | 10 ++++++++++ src/qt/bitcoingui.h | 3 +++ src/qt/hardwaresigntxdialog.cpp | 12 ++++++++++-- src/qt/hardwaresigntxdialog.h | 6 +++++- src/qt/walletframe.cpp | 7 +++++++ src/qt/walletframe.h | 2 ++ src/qt/walletview.cpp | 10 ++++++++++ src/qt/walletview.h | 2 ++ 8 files changed, 49 insertions(+), 3 deletions(-) diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index de05c7975d..09e240d418 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -411,6 +411,9 @@ void BitcoinGUI::createActions() signMessageAction->setStatusTip(tr("Sign messages with your Qtum addresses to prove you own them")); verifyMessageAction = new QAction(tr("&Verify message..."), this); verifyMessageAction->setStatusTip(tr("Verify messages to ensure they were signed with specified Qtum addresses")); + signTxHardwareAction = new QAction(tr("Sign with &hardware..."), this); + signTxHardwareAction->setStatusTip(tr("Sign transaction with hardware wallet")); + signTxHardwareAction->setCheckable(true); openRPCConsoleAction = new QAction(tr("Node window"), this); openRPCConsoleAction->setStatusTip(tr("Open node debugging and diagnostic console")); @@ -467,6 +470,7 @@ void BitcoinGUI::createActions() connect(verifyMessageAction, &QAction::triggered, [this]{ gotoVerifyMessageTab(); }); connect(usedSendingAddressesAction, &QAction::triggered, walletFrame, &WalletFrame::usedSendingAddresses); connect(usedReceivingAddressesAction, &QAction::triggered, walletFrame, &WalletFrame::usedReceivingAddresses); + connect(signTxHardwareAction, &QAction::triggered, [this]{ signTxHardware(); }); connect(openAction, &QAction::triggered, this, &BitcoinGUI::openClicked); connect(m_open_wallet_menu, &QMenu::aboutToShow, [this] { m_open_wallet_menu->clear(); @@ -536,6 +540,7 @@ void BitcoinGUI::createMenuBar() file->addAction(restoreWalletAction); file->addAction(signMessageAction); file->addAction(verifyMessageAction); + file->addAction(signTxHardwareAction); file->addSeparator(); } file->addAction(quitAction); @@ -851,6 +856,7 @@ void BitcoinGUI::setWalletActionsEnabled(bool enabled) delegationAction->setEnabled(enabled); superStakerAction->setEnabled(enabled); walletStakeAction->setEnabled(enabled); + signTxHardwareAction->setEnabled(enabled); m_close_wallet_action->setEnabled(enabled); } @@ -1035,6 +1041,10 @@ void BitcoinGUI::gotoVerifyMessageTab(QString addr) { if (walletFrame) walletFrame->gotoVerifyMessageTab(addr); } +void BitcoinGUI::signTxHardware(const QString& tx) +{ + if (walletFrame) walletFrame->signTxHardware(tx); +} #endif // ENABLE_WALLET void BitcoinGUI::updateNetworkState() diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h index bf05fbaaf2..af9734d568 100644 --- a/src/qt/bitcoingui.h +++ b/src/qt/bitcoingui.h @@ -171,6 +171,7 @@ class BitcoinGUI : public QMainWindow QAction* delegationAction = nullptr; QAction* superStakerAction = nullptr; QAction* walletStakeAction = nullptr; + QAction* signTxHardwareAction = nullptr; QAction* m_create_wallet_action{nullptr}; QAction* m_open_wallet_action{nullptr}; QMenu* m_open_wallet_menu{nullptr}; @@ -318,6 +319,8 @@ public Q_SLOTS: void gotoSignMessageTab(QString addr = ""); /** Show Sign/Verify Message dialog and switch to verify message tab */ void gotoVerifyMessageTab(QString addr = ""); + /** Sign transaction with hardware wallet*/ + void signTxHardware(const QString& tx = ""); /** Show open dialog */ void openClicked(); diff --git a/src/qt/hardwaresigntxdialog.cpp b/src/qt/hardwaresigntxdialog.cpp index e541b1651a..9a1c1b22f7 100644 --- a/src/qt/hardwaresigntxdialog.cpp +++ b/src/qt/hardwaresigntxdialog.cpp @@ -1,11 +1,14 @@ #include #include +#include -HardwareSignTxDialog::HardwareSignTxDialog(QWidget *parent) : +HardwareSignTxDialog::HardwareSignTxDialog(const QString &tx, QWidget *parent) : QDialog(parent), - ui(new Ui::HardwareSignTxDialog) + ui(new Ui::HardwareSignTxDialog), + m_model(0) { ui->setupUi(this); + ui->textEditTxData->setText(tx); } HardwareSignTxDialog::~HardwareSignTxDialog() @@ -17,3 +20,8 @@ void HardwareSignTxDialog::on_cancelButton_clicked() { QDialog::reject(); } + +void HardwareSignTxDialog::setModel(WalletModel *model) +{ + m_model = model; +} diff --git a/src/qt/hardwaresigntxdialog.h b/src/qt/hardwaresigntxdialog.h index 0a671857c3..ba9a37daf4 100644 --- a/src/qt/hardwaresigntxdialog.h +++ b/src/qt/hardwaresigntxdialog.h @@ -6,20 +6,24 @@ namespace Ui { class HardwareSignTxDialog; } +class WalletModel; class HardwareSignTxDialog : public QDialog { Q_OBJECT public: - explicit HardwareSignTxDialog(QWidget *parent = nullptr); + explicit HardwareSignTxDialog(const QString &tx, QWidget *parent = nullptr); ~HardwareSignTxDialog(); + void setModel(WalletModel *model); + private Q_SLOTS: void on_cancelButton_clicked(); private: Ui::HardwareSignTxDialog *ui; + WalletModel* m_model; }; #endif // HARDWARESIGNTXDIALOG_H diff --git a/src/qt/walletframe.cpp b/src/qt/walletframe.cpp index 6c764d1026..db84d775eb 100644 --- a/src/qt/walletframe.cpp +++ b/src/qt/walletframe.cpp @@ -328,3 +328,10 @@ void WalletFrame::updateTabBar(WalletView *walletView, int index) gui->setTabBarInfo(0); } } + +void WalletFrame::signTxHardware(const QString& tx) +{ + WalletView *walletView = currentWalletView(); + if (walletView) + walletView->signTxHardware(tx); +} diff --git a/src/qt/walletframe.h b/src/qt/walletframe.h index 11cee3c7b6..54096e642c 100644 --- a/src/qt/walletframe.h +++ b/src/qt/walletframe.h @@ -105,6 +105,8 @@ public Q_SLOTS: void unlockWallet(); /** Lock the wallet */ void lockWallet(); + /** Sign transaction with hardware wallet*/ + void signTxHardware(const QString& tx = ""); /** Show used sending addresses */ void usedSendingAddresses(); diff --git a/src/qt/walletview.cpp b/src/qt/walletview.cpp index eae714a822..f2f092674e 100644 --- a/src/qt/walletview.cpp +++ b/src/qt/walletview.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -460,3 +461,12 @@ void WalletView::requestedSyncWarningInfo() { Q_EMIT outOfSyncWarningClicked(); } + +void WalletView::signTxHardware(const QString &tx) +{ + if(!walletModel) + return; + HardwareSignTxDialog dlg(tx, this); + dlg.setModel(walletModel); + dlg.exec(); +} diff --git a/src/qt/walletview.h b/src/qt/walletview.h index 050593f285..00aaa37d28 100644 --- a/src/qt/walletview.h +++ b/src/qt/walletview.h @@ -138,6 +138,8 @@ public Q_SLOTS: void unlockWallet(bool fromMenu = false); /** Lock the wallet */ void lockWallet(); + /** Sign transaction with hardware wallet*/ + void signTxHardware(const QString& tx = ""); /** Show used sending addresses */ void usedSendingAddresses(); From fd22889d5a04074b99a3eb8ac83421904a4a6b9c Mon Sep 17 00:00:00 2001 From: Toni Markov Date: Mon, 28 Dec 2020 11:59:48 +0100 Subject: [PATCH 018/164] Add derivation path dialog --- src/Makefile.qt.include | 4 + src/qt/derivationpathdialog.cpp | 19 +++ src/qt/derivationpathdialog.h | 25 ++++ src/qt/forms/derivationpathdialog.ui | 181 +++++++++++++++++++++++++++ 4 files changed, 229 insertions(+) create mode 100644 src/qt/derivationpathdialog.cpp create mode 100644 src/qt/derivationpathdialog.h create mode 100644 src/qt/forms/derivationpathdialog.ui diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index 3dbd45ee69..ece5585462 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -23,6 +23,7 @@ QT_FORMS_UI = \ qt/forms/delegationitemwidget.ui \ qt/forms/delegationpage.ui \ qt/forms/delegationsstakerdialog.ui \ + qt/forms/derivationpathdialog.ui \ qt/forms/editaddressdialog.ui \ qt/forms/editcontractinfodialog.ui \ qt/forms/editsuperstakerdialog.ui \ @@ -92,6 +93,7 @@ QT_MOC_CPP = \ qt/moc_delegationpage.cpp \ qt/moc_delegationsstakerdialog.cpp \ qt/moc_delegationstakeritemmodel.cpp \ + qt/moc_derivationpathdialog.cpp \ qt/moc_editaddressdialog.cpp \ qt/moc_editcontractinfodialog.cpp \ qt/moc_editsuperstakerdialog.cpp \ @@ -220,6 +222,7 @@ BITCOIN_QT_H = \ qt/delegationpage.h \ qt/delegationsstakerdialog.h \ qt/delegationstakeritemmodel.h \ + qt/derivationpathdialog.h \ qt/editaddressdialog.h \ qt/editcontractinfodialog.h \ qt/editsuperstakerdialog.h \ @@ -448,6 +451,7 @@ BITCOIN_QT_WALLET_CPP = \ qt/delegationlistwidget.cpp \ qt/delegationpage.cpp \ qt/delegationsstakerdialog.cpp \ + qt/derivationpathdialog.cpp \ qt/eventlog.cpp \ qt/execrpccommand.cpp \ qt/createwalletdialog.cpp \ diff --git a/src/qt/derivationpathdialog.cpp b/src/qt/derivationpathdialog.cpp new file mode 100644 index 0000000000..21df98cc13 --- /dev/null +++ b/src/qt/derivationpathdialog.cpp @@ -0,0 +1,19 @@ +#include +#include + +DerivationPathDialog::DerivationPathDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::DerivationPathDialog) +{ + ui->setupUi(this); +} + +DerivationPathDialog::~DerivationPathDialog() +{ + delete ui; +} + +void DerivationPathDialog::on_backButton_clicked() +{ + QDialog::reject(); +} diff --git a/src/qt/derivationpathdialog.h b/src/qt/derivationpathdialog.h new file mode 100644 index 0000000000..a756238de0 --- /dev/null +++ b/src/qt/derivationpathdialog.h @@ -0,0 +1,25 @@ +#ifndef DERIVATIONPATHDIALOG_H +#define DERIVATIONPATHDIALOG_H + +#include + +namespace Ui { +class DerivationPathDialog; +} + +class DerivationPathDialog : public QDialog +{ + Q_OBJECT + +public: + explicit DerivationPathDialog(QWidget *parent = nullptr); + ~DerivationPathDialog(); + +private Q_SLOTS: + void on_backButton_clicked(); + +private: + Ui::DerivationPathDialog *ui; +}; + +#endif // DERIVATIONPATHDIALOG_H diff --git a/src/qt/forms/derivationpathdialog.ui b/src/qt/forms/derivationpathdialog.ui new file mode 100644 index 0000000000..a71d161613 --- /dev/null +++ b/src/qt/forms/derivationpathdialog.ui @@ -0,0 +1,181 @@ + + + DerivationPathDialog + + + + 0 + 0 + 565 + 442 + + + + Select script type and derivation path + + + + 0 + + + 0 + + + 0 + + + + + 12 + + + 30 + + + 30 + + + + + + 75 + true + + + + Script type and derivation path + + + + + + + + + Choose the type of addresses in your wallet. + + + + + + legacy (p2pkh) + + + true + + + + + + + p2sh-segwit (p2wpkh-p2sh) + + + + + + + native segwit (p2wpkh) + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 40 + + + + + + + + You can override the suggested derivation path. If you are not sure what this is, leave this field unchanged. + + + true + + + + + + + m/44'/88'/0' + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 30 + + + 15 + + + 30 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Back + + + + + + + Next + + + + + + + + + + + From 20723bbf1565be2566f31e0722403fae981a5b06 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 28 Dec 2020 13:20:00 +0100 Subject: [PATCH 019/164] Display error message when creating hardware wallet --- src/qt/hardwaredevicedialog.cpp | 14 +++++++++++++- src/qt/hardwaredevicedialog.h | 3 ++- src/qt/hardwarekeystoredialog.cpp | 12 ++++++++++-- src/qt/hardwarekeystoredialog.h | 4 +++- src/qt/qtumhwitool.cpp | 27 ++++++++++++++++++++++----- src/qt/qtumhwitool.h | 8 ++++++++ src/qt/walletcontroller.cpp | 23 +++++++++++++++++++---- 7 files changed, 77 insertions(+), 14 deletions(-) diff --git a/src/qt/hardwaredevicedialog.cpp b/src/qt/hardwaredevicedialog.cpp index 6d6ee8c163..8be00fd0e2 100644 --- a/src/qt/hardwaredevicedialog.cpp +++ b/src/qt/hardwaredevicedialog.cpp @@ -1,11 +1,18 @@ #include #include +#include -HardwareDeviceDialog::HardwareDeviceDialog(QWidget *parent) : +HardwareDeviceDialog::HardwareDeviceDialog(const QString& debugMessage, QWidget *parent) : QDialog(parent), ui(new Ui::HardwareDeviceDialog) { ui->setupUi(this); + ui->textEditDebugMessage->setText(debugMessage); +#ifdef Q_OS_LINUX + ui->labelLinuxPermissions->setVisible(true); +#else + ui->labelLinuxPermissions->setVisible(false); +#endif } HardwareDeviceDialog::~HardwareDeviceDialog() @@ -17,3 +24,8 @@ void HardwareDeviceDialog::on_cancelButton_clicked() { QDialog::reject(); } + +void HardwareDeviceDialog::on_nextButton_clicked() +{ + QDialog::accept(); +} diff --git a/src/qt/hardwaredevicedialog.h b/src/qt/hardwaredevicedialog.h index a8c411239f..44b8cf6d84 100644 --- a/src/qt/hardwaredevicedialog.h +++ b/src/qt/hardwaredevicedialog.h @@ -12,11 +12,12 @@ class HardwareDeviceDialog : public QDialog Q_OBJECT public: - explicit HardwareDeviceDialog(QWidget *parent = nullptr); + explicit HardwareDeviceDialog(const QString& debugMessage, QWidget *parent = nullptr); ~HardwareDeviceDialog(); private Q_SLOTS: void on_cancelButton_clicked(); + void on_nextButton_clicked(); private: Ui::HardwareDeviceDialog *ui; diff --git a/src/qt/hardwarekeystoredialog.cpp b/src/qt/hardwarekeystoredialog.cpp index 64d24fe8c2..6d72f9072e 100644 --- a/src/qt/hardwarekeystoredialog.cpp +++ b/src/qt/hardwarekeystoredialog.cpp @@ -63,11 +63,12 @@ void HardwareKeystoreDialog::setCurrentIndex(int index) } } -bool HardwareKeystoreDialog::SelectDevice(QString &fingerprint, QWidget *parent) +bool HardwareKeystoreDialog::SelectDevice(QString &fingerprint, QString& errorMessage, bool& canceled, QWidget *parent) { // Enumerate devices QtumHwiTool hwiTool(parent); QList devices; + canceled = false; if(hwiTool.enumerate(devices)) { // Get valid devices @@ -86,14 +87,21 @@ bool HardwareKeystoreDialog::SelectDevice(QString &fingerprint, QWidget *parent) if(listDeviceKey.length() > 0) { HardwareKeystoreDialog keystoreDialog(listDeviceValue, parent); - if(keystoreDialog.exec() == QDialog::Accepted && + int result = keystoreDialog.exec(); + if(result == QDialog::Accepted && keystoreDialog.currentIndex() != -1) { fingerprint = listDeviceKey[keystoreDialog.currentIndex()]; return true; } + if(result == QDialog::Rejected) + { + canceled = true; + } } } + errorMessage = hwiTool.errorMessage(); + return false; } diff --git a/src/qt/hardwarekeystoredialog.h b/src/qt/hardwarekeystoredialog.h index c1360c2a85..02096c989c 100644 --- a/src/qt/hardwarekeystoredialog.h +++ b/src/qt/hardwarekeystoredialog.h @@ -46,10 +46,12 @@ class HardwareKeystoreDialog : public QDialog /** * @brief SelectDevice Select hardware keystore device * @param fingerprint Fingerprint of the selected device + * @param errorMessage Error message during device selection + * @param canceled Device selection canceled by the user * @param parent Parent widget * @return true: device selected; false: device not selected */ - static bool SelectDevice(QString& fingerprint, QWidget *parent = 0); + static bool SelectDevice(QString& fingerprint, QString& errorMessage, bool& canceled, QWidget *parent = 0); private: Ui::HardwareKeystoreDialog *ui; diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 0141e76da2..47a2f13038 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -42,7 +42,7 @@ class QtumHwiToolPriv std::atomic fStarted{false}; QProcess process; QString strStdout; - QString strStderr; + QString strError; QString toolPath; QStringList arguments; @@ -66,6 +66,11 @@ bool HWDevice::isValid() const return fingerprint != ""; } +QString HWDevice::errorMessage() const +{ + return QString("Error: %1\nCode: %2").arg(error, code); +} + QtumHwiTool::QtumHwiTool(QObject *parent) : QObject(parent) { d = new QtumHwiToolPriv(this); @@ -139,7 +144,7 @@ QString QtumHwiTool::errorMessage() if(d->fStarted) return tr("Started"); - return d->strStderr; + return d->strError; } bool QtumHwiTool::isStarted() @@ -153,7 +158,7 @@ void QtumHwiTool::wait() { d->process.waitForFinished(-1); d->strStdout = d->process.readAllStandardOutput(); - d->strStderr = d->process.readAllStandardError(); + d->strError = d->process.readAllStandardError(); d->fStarted = false; } } @@ -214,7 +219,12 @@ bool QtumHwiTool::endEnumerate(QList &devices) device.path = data["path"].toString(); device.error = data["error"].toString(); device.model = data["model"].toString(); + device.code = data["code"].toString(); devices.push_back(device); + + // Set error message + if(!device.isValid()) + addError(device.errorMessage()); } return devices.size() > 0; @@ -349,9 +359,16 @@ void QtumHwiTool::setModel(WalletModel *model) bool QtumHwiTool::execRPC(ExecRPCCommand *cmd, const QMap &lstParams, QVariant &result, QString &resultJson) { - d->strStderr.clear(); - if(!cmd->exec(d->model->node(), d->model, lstParams, result, resultJson, d->strStderr)) + d->strError.clear(); + if(!cmd->exec(d->model->node(), d->model, lstParams, result, resultJson, d->strError)) return false; return true; } + +void QtumHwiTool::addError(const QString &error) +{ + if(d->strError != "") + d->strError += "\n"; + d->strError += error; +} diff --git a/src/qt/qtumhwitool.h b/src/qt/qtumhwitool.h index cc5ec235c7..c9ccba279e 100644 --- a/src/qt/qtumhwitool.h +++ b/src/qt/qtumhwitool.h @@ -31,6 +31,12 @@ class HWDevice */ bool isValid() const; + /** + * @brief error Get error message for device + * @return Error message + */ + QString errorMessage() const; + /// Device data QString fingerprint; QString serial_number; @@ -38,6 +44,7 @@ class HWDevice QString path; QString error; QString model; + QString code; }; /** @@ -146,6 +153,7 @@ public Q_SLOTS: bool endGetKeyPool(const QString& fingerprint, QString& desc); bool endSignTx(const QString& fingerprint, QString& psbt); bool execRPC(ExecRPCCommand* cmd, const QMap& lstParams, QVariant& result, QString& resultJson); + void addError(const QString& error); QtumHwiToolPriv* d; }; diff --git a/src/qt/walletcontroller.cpp b/src/qt/walletcontroller.cpp index 812cc82dea..4bfd15d3cf 100644 --- a/src/qt/walletcontroller.cpp +++ b/src/qt/walletcontroller.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -219,16 +220,30 @@ void CreateWalletActivity::askDevice() QString hwiToolPath = GUIUtil::getHwiToolPath(); if(QFile::exists(hwiToolPath)) { - QTimer::singleShot(500, worker(), [this] { - if(HardwareKeystoreDialog::SelectDevice(m_fingerprint, m_parent_widget)) + QString errorMessage; + bool canceled = false; + if(HardwareKeystoreDialog::SelectDevice(m_fingerprint, errorMessage, canceled, m_parent_widget)) + { + createWallet(); + } + else if(canceled) + { + Q_EMIT finished(); + } + else + { + HardwareDeviceDialog dlg(errorMessage, m_parent_widget); + if(dlg.exec() == QDialog::Accepted) { - createWallet(); + QTimer::singleShot(500, this, [this] { + this->askDevice(); + }); } else { Q_EMIT finished(); } - }); + } } else { From fc61aa5b0a012587f082d281e40977308851e0ce Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 28 Dec 2020 13:51:39 +0100 Subject: [PATCH 020/164] Show sign tx with hardware when the support is enabled --- src/qt/bitcoingui.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 09e240d418..61f48495fd 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -540,7 +540,10 @@ void BitcoinGUI::createMenuBar() file->addAction(restoreWalletAction); file->addAction(signMessageAction); file->addAction(verifyMessageAction); - file->addAction(signTxHardwareAction); + if(::Params().HasHardwareWalletSupport()) + { + file->addAction(signTxHardwareAction); + } file->addSeparator(); } file->addAction(quitAction); From baaca291aef636ff3250f8cd03e754864ac34258 Mon Sep 17 00:00:00 2001 From: Toni Markov Date: Mon, 28 Dec 2020 15:23:55 +0100 Subject: [PATCH 021/164] Update hardware key store dialog GUI --- src/qt/forms/hardwarekeystoredialog.ui | 134 ++++++++++++++----------- src/qt/hardwarekeystoredialog.cpp | 10 ++ src/qt/hardwarekeystoredialog.h | 4 + 3 files changed, 87 insertions(+), 61 deletions(-) diff --git a/src/qt/forms/hardwarekeystoredialog.ui b/src/qt/forms/hardwarekeystoredialog.ui index 36e490f80a..568da3266d 100644 --- a/src/qt/forms/hardwarekeystoredialog.ui +++ b/src/qt/forms/hardwarekeystoredialog.ui @@ -6,8 +6,8 @@ 0 0 - 475 - 300 + 550 + 362 @@ -17,79 +17,91 @@ - - 15 - - 20 - - - 20 + 0 - 15 + 0 - 15 + 0 - - - - 0 - 0 - + + + 12 - - Select a device: + + 30 - + + 30 + + + + + + 0 + 0 + + + + + 75 + true + + + + Select a device: + + + +
- - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - + + + + 30 + + + 15 + + + 30 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Cancel + + + + + + + Next + + + +
- - - buttonBox - accepted() - HardwareKeystoreDialog - accept() - - - 20 - 20 - - - 20 - 20 - - - - - buttonBox - rejected() - HardwareKeystoreDialog - reject() - - - 20 - 20 - - - 20 - 20 - - - - + diff --git a/src/qt/hardwarekeystoredialog.cpp b/src/qt/hardwarekeystoredialog.cpp index 6d72f9072e..78b7d0bab6 100644 --- a/src/qt/hardwarekeystoredialog.cpp +++ b/src/qt/hardwarekeystoredialog.cpp @@ -105,3 +105,13 @@ bool HardwareKeystoreDialog::SelectDevice(QString &fingerprint, QString& errorM return false; } + +void HardwareKeystoreDialog::on_cancelButton_clicked() +{ + QDialog::reject(); +} + +void HardwareKeystoreDialog::on_nextButton_clicked() +{ + QDialog::accept(); +} diff --git a/src/qt/hardwarekeystoredialog.h b/src/qt/hardwarekeystoredialog.h index 02096c989c..0e13e7b3d2 100644 --- a/src/qt/hardwarekeystoredialog.h +++ b/src/qt/hardwarekeystoredialog.h @@ -53,6 +53,10 @@ class HardwareKeystoreDialog : public QDialog */ static bool SelectDevice(QString& fingerprint, QString& errorMessage, bool& canceled, QWidget *parent = 0); +private Q_SLOTS: + void on_cancelButton_clicked(); + void on_nextButton_clicked(); + private: Ui::HardwareKeystoreDialog *ui; HardwareKeystoreDialogPriv *d; From bc293f0044009b56677f84e086ff91b3e56d0894 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 28 Dec 2020 15:36:10 +0100 Subject: [PATCH 022/164] Add decode psbt in hwi tool --- src/qt/hardwaresigntxdialog.cpp | 41 ++++++++++++++++++++++++++++++--- src/qt/hardwaresigntxdialog.h | 4 +++- src/qt/qtumhwitool.cpp | 29 +++++++++++++++++++++++ src/qt/qtumhwitool.h | 8 +++++++ 4 files changed, 78 insertions(+), 4 deletions(-) diff --git a/src/qt/hardwaresigntxdialog.cpp b/src/qt/hardwaresigntxdialog.cpp index 9a1c1b22f7..09a2360d90 100644 --- a/src/qt/hardwaresigntxdialog.cpp +++ b/src/qt/hardwaresigntxdialog.cpp @@ -1,19 +1,40 @@ #include #include #include +#include + +class HardwareSignTxDialogPriv +{ +public: + HardwareSignTxDialogPriv(QObject *parent) + { + tool = new QtumHwiTool(parent); + } + + WalletModel* model = 0; + QtumHwiTool* tool = 0; + QString psbt; +}; HardwareSignTxDialog::HardwareSignTxDialog(const QString &tx, QWidget *parent) : QDialog(parent), - ui(new Ui::HardwareSignTxDialog), - m_model(0) + ui(new Ui::HardwareSignTxDialog) { + // Init variables ui->setupUi(this); + d = new HardwareSignTxDialogPriv(this); ui->textEditTxData->setText(tx); + ui->textEditTxData->setReadOnly(tx != ""); + ui->textEditTxDetails->setReadOnly(true); + + // Connect slots + connect(ui->textEditTxData, &QTextEdit::textChanged, this, &HardwareSignTxDialog::txChanged); } HardwareSignTxDialog::~HardwareSignTxDialog() { delete ui; + delete d; } void HardwareSignTxDialog::on_cancelButton_clicked() @@ -23,5 +44,19 @@ void HardwareSignTxDialog::on_cancelButton_clicked() void HardwareSignTxDialog::setModel(WalletModel *model) { - m_model = model; + d->model = model; + d->tool->setModel(model); + txChanged(); +} + +void HardwareSignTxDialog::txChanged() +{ + QString psbt = ui->textEditTxData->toPlainText().trimmed(); + QString decoded; + if(psbt != d->psbt) + { + d->psbt = psbt; + d->tool->decodePsbt(psbt, decoded); + ui->textEditTxDetails->setText(decoded); + } } diff --git a/src/qt/hardwaresigntxdialog.h b/src/qt/hardwaresigntxdialog.h index ba9a37daf4..b86fe25742 100644 --- a/src/qt/hardwaresigntxdialog.h +++ b/src/qt/hardwaresigntxdialog.h @@ -6,6 +6,7 @@ namespace Ui { class HardwareSignTxDialog; } +class HardwareSignTxDialogPriv; class WalletModel; class HardwareSignTxDialog : public QDialog @@ -20,10 +21,11 @@ class HardwareSignTxDialog : public QDialog private Q_SLOTS: void on_cancelButton_clicked(); + void txChanged(); private: Ui::HardwareSignTxDialog *ui; - WalletModel* m_model; + HardwareSignTxDialogPriv* d; }; #endif // HARDWARESIGNTXDIALOG_H diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 47a2f13038..8a8d630b13 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -7,6 +7,8 @@ #include #include #include +#include +#include #include #include @@ -37,6 +39,12 @@ class QtumHwiToolPriv cmdFinalize = new ExecRPCCommand("finalizepsbt", mandatoryFinalize, QStringList(), QMap(), parent); QStringList mandatorySend = QStringList() << PARAM_HEXTX; cmdSend = new ExecRPCCommand("finalizepsbt", mandatorySend, QStringList(), QMap(), parent); + QStringList mandatoryDecode = QStringList() << PARAM_PSBT; + cmdDecode = new ExecRPCCommand("decodepsbt", mandatoryDecode, QStringList(), QMap(), parent); + if(gArgs.GetChainName() != CBaseChainParams::MAIN) + { + arguments << "--testnet"; + } } std::atomic fStarted{false}; @@ -50,6 +58,7 @@ class QtumHwiToolPriv ExecRPCCommand* cmdImport = 0; ExecRPCCommand* cmdFinalize = 0; ExecRPCCommand* cmdSend = 0; + ExecRPCCommand* cmdDecode = 0; WalletModel* model = 0; }; @@ -352,6 +361,26 @@ bool QtumHwiTool::sendRawTransaction(const QString &hexTx) return strHash.length() == 64 && IsHex(strHash); } +bool QtumHwiTool::decodePsbt(const QString &psbt, QString &decoded) +{ + if(!d->model) return false; + + // Add params for RPC + QMap lstParams; + QVariant result; + QString resultStr; + ExecRPCCommand::appendParam(lstParams, PARAM_PSBT, psbt); + + // Exec RPC + if(!execRPC(d->cmdDecode, lstParams, result, resultStr)) + return false; + + // Parse results + decoded = resultStr; + + return true; +} + void QtumHwiTool::setModel(WalletModel *model) { d->model = model; diff --git a/src/qt/qtumhwitool.h b/src/qt/qtumhwitool.h index c9ccba279e..0d7a57b09a 100644 --- a/src/qt/qtumhwitool.h +++ b/src/qt/qtumhwitool.h @@ -126,6 +126,14 @@ class QtumHwiTool : public QObject */ bool sendRawTransaction(const QString& hexTx); + /** + * @brief decodePsbt Decode psbt transaction + * @param psbt Psbt transaction + * @param decoded Decoded transaction + * @return success of the operation + */ + bool decodePsbt(const QString& psbt, QString& decoded); + /** * @brief errorMessage Get the last error message * @return Last error message From 6d82ee1bf7d52407ed52071e94237b5f068fc032 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Tue, 29 Dec 2020 10:38:27 +0100 Subject: [PATCH 023/164] Add output type in hwi get key pool --- src/qt/qtumhwitool.cpp | 42 ++++++++++++++++++++++++++++++++++++------ src/qt/qtumhwitool.h | 31 ++++++++++++++++++++++++++++--- 2 files changed, 64 insertions(+), 9 deletions(-) diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 8a8d630b13..b5fc2f166b 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -119,18 +120,33 @@ bool QtumHwiTool::isConnected(const QString &fingerprint) return false; } -bool QtumHwiTool::getKeyPool(const QString &fingerprint, QString &desc) +bool QtumHwiTool::getKeyPool(const QString &fingerprint, int type, QString &desc) { // Get the key pool for a device if(isStarted()) return false; - if(!beginGetKeyPool(fingerprint, desc)) + if(!beginGetKeyPool(fingerprint, type, desc)) return false; wait(); - return endGetKeyPool(fingerprint, desc); + return endGetKeyPool(fingerprint, type, desc); +} + +bool QtumHwiTool::getKeyPoolPKH(const QString &fingerprint, QString &desc) +{ + return getKeyPool(fingerprint, (int)OutputType::LEGACY, desc); +} + +bool QtumHwiTool::getKeyPoolP2SH(const QString &fingerprint, QString &desc) +{ + return getKeyPool(fingerprint, (int)OutputType::P2SH_SEGWIT, desc); +} + +bool QtumHwiTool::getKeyPoolBech32(const QString &fingerprint, QString &desc) +{ + return getKeyPool(fingerprint, (int)OutputType::BECH32, desc); } bool QtumHwiTool::signTx(const QString &fingerprint, QString &psbt) @@ -185,13 +201,26 @@ bool QtumHwiTool::beginEnumerate(QList &devices) return d->fStarted; } -bool QtumHwiTool::beginGetKeyPool(const QString &fingerprint, QString &desc) +bool QtumHwiTool::beginGetKeyPool(const QString &fingerprint, int type, QString &desc) { Q_UNUSED(desc); + // Get the output type + QString descType; + switch (type) { + case (int)OutputType::P2SH_SEGWIT: + descType = "--sh_wpkh"; + break; + case (int)OutputType::BECH32: + descType = "--wpkh"; + break; + default: + break; + } + // Execute command line QStringList arguments = d->arguments; - arguments << "-f" << fingerprint << "getkeypool" << "--wpkh" << "0" << "1000"; + arguments << "-f" << fingerprint << "getkeypool" << descType << "0" << "1000"; d->process.start(d->toolPath, arguments); d->fStarted = true; @@ -239,9 +268,10 @@ bool QtumHwiTool::endEnumerate(QList &devices) return devices.size() > 0; } -bool QtumHwiTool::endGetKeyPool(const QString &fingerprint, QString &desc) +bool QtumHwiTool::endGetKeyPool(const QString &fingerprint, int type, QString &desc) { Q_UNUSED(fingerprint); + Q_UNUSED(type); // Decode command line results desc = d->strStdout; diff --git a/src/qt/qtumhwitool.h b/src/qt/qtumhwitool.h index 0d7a57b09a..909208e9e6 100644 --- a/src/qt/qtumhwitool.h +++ b/src/qt/qtumhwitool.h @@ -82,10 +82,35 @@ class QtumHwiTool : public QObject /** * @brief getKeyPool Get the key pool for a device * @param fingerprint Hardware wallet device fingerprint + * @param type Type of output * @param desc Address descriptors * @return success of the operation */ - bool getKeyPool(const QString& fingerprint, QString& desc); + bool getKeyPool(const QString& fingerprint, int type, QString& desc); + + /** + * @brief getKeyPoolPkh Get the PKH key pool for a device + * @param fingerprint Hardware wallet device fingerprint + * @param desc Address descriptors + * @return success of the operation + */ + bool getKeyPoolPKH(const QString& fingerprint, QString& desc); + + /** + * @brief getKeyPoolP2SH Get the P2SH key pool for a device + * @param fingerprint Hardware wallet device fingerprint + * @param desc Address descriptors + * @return success of the operation + */ + bool getKeyPoolP2SH(const QString& fingerprint, QString& desc); + + /** + * @brief getKeyPoolBech32 Get the Bech32 key pool for a device + * @param fingerprint Hardware wallet device fingerprint + * @param desc Address descriptors + * @return success of the operation + */ + bool getKeyPoolBech32(const QString& fingerprint, QString& desc); /** * @brief signTx Sign PSBT transaction @@ -155,10 +180,10 @@ public Q_SLOTS: void wait(); bool beginEnumerate(QList& devices); - bool beginGetKeyPool(const QString& fingerprint, QString& desc); + bool beginGetKeyPool(const QString& fingerprint, int type, QString& desc); bool beginSignTx(const QString& fingerprint, QString& psbt); bool endEnumerate(QList& devices); - bool endGetKeyPool(const QString& fingerprint, QString& desc); + bool endGetKeyPool(const QString& fingerprint, int type, QString& desc); bool endSignTx(const QString& fingerprint, QString& psbt); bool execRPC(ExecRPCCommand* cmd, const QMap& lstParams, QVariant& result, QString& resultJson); void addError(const QString& error); From 11bd9117843551478d3311204e27f44571e5384b Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Tue, 29 Dec 2020 13:32:59 +0100 Subject: [PATCH 024/164] Setup hardware wallet key pool --- src/qt/qtumhwitool.cpp | 5 +++- src/qt/walletcontroller.cpp | 10 ++++++++ src/qt/walletmodel.cpp | 49 +++++++++++++++++++++++++++++++++++++ src/qt/walletmodel.h | 7 ++++++ 4 files changed, 70 insertions(+), 1 deletion(-) diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index b5fc2f166b..6296de835c 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -220,7 +220,10 @@ bool QtumHwiTool::beginGetKeyPool(const QString &fingerprint, int type, QString // Execute command line QStringList arguments = d->arguments; - arguments << "-f" << fingerprint << "getkeypool" << descType << "0" << "1000"; + arguments << "-f" << fingerprint << "getkeypool"; + if(descType != "") + arguments << descType; + arguments << "0" << "1000"; d->process.start(d->toolPath, arguments); d->fStarted = true; diff --git a/src/qt/walletcontroller.cpp b/src/qt/walletcontroller.cpp index 4bfd15d3cf..40a4344bf5 100644 --- a/src/qt/walletcontroller.cpp +++ b/src/qt/walletcontroller.cpp @@ -291,6 +291,16 @@ void CreateWalletActivity::finish() QMessageBox::warning(m_parent_widget, tr("Create wallet warning"), QString::fromStdString(Join(m_warning_message, "\n"))); } + // Set hardware wallet parameters to the model + if(m_create_wallet_dialog->isHardwareWalletChecked()) + { + if(m_wallet_model) + { + m_wallet_model->setFingerprint(m_fingerprint); + m_wallet_model->setHardwareWalletInitRequired(true); + } + } + if (m_wallet_model) Q_EMIT created(m_wallet_model); Q_EMIT finished(); diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index 6acd9e9b9d..ff9c3ddde5 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -30,6 +30,7 @@ #include // for GetBoolArg #include #include // for CRecipient +#include #include @@ -51,6 +52,7 @@ private Q_SLOTS: void updateModel() { // Update the model with results of task that take more time to be completed + walletModel->checkHardwareWallet(); walletModel->checkCoinAddressesChanged(); walletModel->checkStakeWeightChanged(); } @@ -839,3 +841,50 @@ void WalletModel::setFingerprint(const QString &value) { fingerprint = value; } + +bool WalletModel::getHardwareWalletInitRequired() const +{ + return hardwareWalletInitRequired; +} + +void WalletModel::setHardwareWalletInitRequired(bool value) +{ + hardwareWalletInitRequired = value; +} + +void WalletModel::checkHardwareWallet() +{ + if(hardwareWalletInitRequired) + { + // Init variables + QtumHwiTool hwiTool(this); + hwiTool.setModel(this); + + if(hwiTool.isConnected(fingerprint)) + { + // Setup key pool + QString pkhdesc; + if(hwiTool.getKeyPoolPKH(fingerprint, pkhdesc)) + { + hwiTool.importMulti(pkhdesc); + } + + QString p2shdesc; + if(hwiTool.getKeyPoolP2SH(fingerprint, p2shdesc)) + { + hwiTool.importMulti(p2shdesc); + } + + QString bech32desc; + if(hwiTool.getKeyPoolP2SH(fingerprint, bech32desc)) + { + hwiTool.importMulti(bech32desc); + } + + // Rescan the chain + hwiTool.rescanBlockchain(); + } + + hardwareWalletInitRequired = false; + } +} diff --git a/src/qt/walletmodel.h b/src/qt/walletmodel.h index d78ff77774..3c96e9e496 100644 --- a/src/qt/walletmodel.h +++ b/src/qt/walletmodel.h @@ -181,6 +181,10 @@ class WalletModel : public QObject QString getFingerprint() const; void setFingerprint(const QString &value); + // Get or set hardware wallet init required (only for hardware wallet applicable) + bool getHardwareWalletInitRequired() const; + void setHardwareWalletInitRequired(bool value); + private: std::unique_ptr m_wallet; std::unique_ptr m_handler_unload; @@ -224,6 +228,7 @@ class WalletModel : public QObject std::atomic updateCoinAddresses; QString fingerprint; + std::atomic hardwareWalletInitRequired{false}; QThread t; WalletWorker *worker; @@ -290,6 +295,8 @@ public Q_SLOTS: void checkCoinAddressesChanged(); /* Update stake weight when changed*/ void checkStakeWeightChanged(); + /* Check for hardware wallet params changes*/ + void checkHardwareWallet(); }; #endif // BITCOIN_QT_WALLETMODEL_H From 4190cf4774b0f3a3e96963e8eaeb4af218a4bf09 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Tue, 29 Dec 2020 14:05:07 +0100 Subject: [PATCH 025/164] Update result data for get key pool --- src/qt/qtumhwitool.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 6296de835c..8174801eeb 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -277,9 +277,17 @@ bool QtumHwiTool::endGetKeyPool(const QString &fingerprint, int type, QString &d Q_UNUSED(type); // Decode command line results - desc = d->strStdout; + bool ret = d->strStdout.contains("desc"); + if(ret) + { + desc = "\"" + d->strStdout.replace("\"", "\\\"") + "\""; + } + else + { + desc = d->strStdout; + } - return d->strStdout.contains("desc"); + return ret; } bool QtumHwiTool::endSignTx(const QString &fingerprint, QString &psbt) From 3238b61989a0f2a41d3eb7da64486a5b207dbfd4 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Tue, 29 Dec 2020 14:45:28 +0100 Subject: [PATCH 026/164] Set not checkable sign with hardware menu --- src/qt/bitcoingui.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 61f48495fd..c17d99985c 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -413,7 +413,6 @@ void BitcoinGUI::createActions() verifyMessageAction->setStatusTip(tr("Verify messages to ensure they were signed with specified Qtum addresses")); signTxHardwareAction = new QAction(tr("Sign with &hardware..."), this); signTxHardwareAction->setStatusTip(tr("Sign transaction with hardware wallet")); - signTxHardwareAction->setCheckable(true); openRPCConsoleAction = new QAction(tr("Node window"), this); openRPCConsoleAction->setStatusTip(tr("Open node debugging and diagnostic console")); From 3d526c3e5f71293d6681eaeeea3ee9214b26fa13 Mon Sep 17 00:00:00 2001 From: Toni Markov Date: Tue, 29 Dec 2020 16:28:59 +0100 Subject: [PATCH 027/164] Add wait message box --- src/Makefile.qt.include | 3 +++ src/qt/waitmessagebox.cpp | 27 +++++++++++++++++++++++++++ src/qt/waitmessagebox.h | 21 +++++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 src/qt/waitmessagebox.cpp create mode 100644 src/qt/waitmessagebox.h diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index ece5585462..a4561b6a3f 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -161,6 +161,7 @@ QT_MOC_CPP = \ qt/moc_walletcontroller.cpp \ qt/moc_qtumversionchecker.cpp \ qt/moc_qtumhwitool.cpp \ + qt/moc_waitmessagebox.cpp \ qt/moc_walletframe.cpp \ qt/moc_walletmodel.cpp \ qt/moc_walletview.cpp @@ -300,6 +301,7 @@ BITCOIN_QT_H = \ qt/utilitydialog.h \ qt/walletcontroller.h \ qt/qtumversionchecker.h \ + qt/waitmessagebox.h \ qt/walletframe.h \ qt/walletmodel.h \ qt/walletmodeltransaction.h \ @@ -498,6 +500,7 @@ BITCOIN_QT_WALLET_CPP = \ qt/tokenitemwidget.cpp \ qt/tokenlistwidget.cpp \ qt/walletcontroller.cpp \ + qt/waitmessagebox.cpp \ qt/walletframe.cpp \ qt/walletmodel.cpp \ qt/walletmodeltransaction.cpp \ diff --git a/src/qt/waitmessagebox.cpp b/src/qt/waitmessagebox.cpp new file mode 100644 index 0000000000..0ca2e8644a --- /dev/null +++ b/src/qt/waitmessagebox.cpp @@ -0,0 +1,27 @@ +#include + +#include +#include +#include + +WaitMessageBox::WaitMessageBox(const QString &title, const QString &content, std::function _run, QWidget *parent) : + QDialog(parent) +{ + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + + setWindowTitle(title); + + QVBoxLayout *mainLay = new QVBoxLayout(this); + QLabel *lbl = new QLabel(content, this); + + mainLay->addWidget(lbl); + run = _run; + + QTimer::singleShot(100, this, SLOT(timeout())); +} + +void WaitMessageBox::timeout() +{ + if(run) run(); + accept(); +} diff --git a/src/qt/waitmessagebox.h b/src/qt/waitmessagebox.h new file mode 100644 index 0000000000..1ff96f7f7e --- /dev/null +++ b/src/qt/waitmessagebox.h @@ -0,0 +1,21 @@ +#ifndef WAITMESSAGEBOX_H +#define WAITMESSAGEBOX_H + +#include +#include +#include + +class WaitMessageBox : public QDialog +{ + Q_OBJECT +public: + WaitMessageBox(const QString &title, const QString &content, std::function run, QWidget *parent = nullptr); + +public Q_SLOTS: + void timeout(); + +private: + std::function run; +}; + +#endif // WAITMESSAGEBOX_H From e8753590736bfc7d31582a40ea8e41a36cb925c3 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Tue, 29 Dec 2020 16:53:00 +0100 Subject: [PATCH 028/164] Update HW send and sign button state --- src/qt/forms/hardwaresigntxdialog.ui | 8 +++++++- src/qt/hardwaresigntxdialog.cpp | 4 +++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/qt/forms/hardwaresigntxdialog.ui b/src/qt/forms/hardwaresigntxdialog.ui index 4a53ad120b..4978bafcb9 100644 --- a/src/qt/forms/hardwaresigntxdialog.ui +++ b/src/qt/forms/hardwaresigntxdialog.ui @@ -128,13 +128,19 @@
+ + false + Sign - + + + false + Send diff --git a/src/qt/hardwaresigntxdialog.cpp b/src/qt/hardwaresigntxdialog.cpp index 09a2360d90..d2888e3750 100644 --- a/src/qt/hardwaresigntxdialog.cpp +++ b/src/qt/hardwaresigntxdialog.cpp @@ -56,7 +56,9 @@ void HardwareSignTxDialog::txChanged() if(psbt != d->psbt) { d->psbt = psbt; - d->tool->decodePsbt(psbt, decoded); + bool isOk = d->tool->decodePsbt(psbt, decoded); ui->textEditTxDetails->setText(decoded); + ui->signButton->setEnabled(isOk); + ui->sendButton->setEnabled(false); } } From 5f63a46058576b08ee1143e3e9c6c6ddd9f01957 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Wed, 30 Dec 2020 11:21:11 +0100 Subject: [PATCH 029/164] Update HW send and sign tx --- src/qt/hardwaresigntxdialog.cpp | 29 +++++++++++++++++++++++++++++ src/qt/hardwaresigntxdialog.h | 2 ++ 2 files changed, 31 insertions(+) diff --git a/src/qt/hardwaresigntxdialog.cpp b/src/qt/hardwaresigntxdialog.cpp index d2888e3750..a17ae33197 100644 --- a/src/qt/hardwaresigntxdialog.cpp +++ b/src/qt/hardwaresigntxdialog.cpp @@ -2,6 +2,7 @@ #include #include #include +#include class HardwareSignTxDialogPriv { @@ -14,6 +15,8 @@ class HardwareSignTxDialogPriv WalletModel* model = 0; QtumHwiTool* tool = 0; QString psbt; + QString hexTx; + bool complete = false; }; HardwareSignTxDialog::HardwareSignTxDialog(const QString &tx, QWidget *parent) : @@ -56,9 +59,35 @@ void HardwareSignTxDialog::txChanged() if(psbt != d->psbt) { d->psbt = psbt; + d->hexTx = ""; + d->complete = false; bool isOk = d->tool->decodePsbt(psbt, decoded); ui->textEditTxDetails->setText(decoded); ui->signButton->setEnabled(isOk); ui->sendButton->setEnabled(false); } } + +void HardwareSignTxDialog::on_signButton_clicked() +{ + WaitMessageBox dlg(tr("Ledger Status"), tr("Confirm Transaction on your Ledger device..."), [this]() { + QString fingerprint = d->model->getFingerprint(); + QString psbt = d->psbt; + d->hexTx = ""; + d->complete = false; + bool ret = d->tool->signTx(fingerprint, psbt); + if(ret) ret &= d->tool->finalizePsbt(psbt, d->hexTx, d->complete); + if(d->complete) + { + ui->sendButton->setEnabled(true); + } + }, this); + + dlg.exec(); +} + +void HardwareSignTxDialog::on_sendButton_clicked() +{ + if(d->tool->sendRawTransaction(d->hexTx)) + QDialog::accept(); +} diff --git a/src/qt/hardwaresigntxdialog.h b/src/qt/hardwaresigntxdialog.h index b86fe25742..9eb2937ab5 100644 --- a/src/qt/hardwaresigntxdialog.h +++ b/src/qt/hardwaresigntxdialog.h @@ -21,6 +21,8 @@ class HardwareSignTxDialog : public QDialog private Q_SLOTS: void on_cancelButton_clicked(); + void on_signButton_clicked(); + void on_sendButton_clicked(); void txChanged(); private: From a968838ca19253fceb4f5423f598efb3c6ce6e83 Mon Sep 17 00:00:00 2001 From: Toni Markov Date: Wed, 30 Dec 2020 11:57:03 +0100 Subject: [PATCH 030/164] Add ask device in hardware key store dialog --- src/qt/hardwarekeystoredialog.cpp | 18 ++++++++++++++++++ src/qt/hardwarekeystoredialog.h | 1 + 2 files changed, 19 insertions(+) diff --git a/src/qt/hardwarekeystoredialog.cpp b/src/qt/hardwarekeystoredialog.cpp index 78b7d0bab6..fff5d7856d 100644 --- a/src/qt/hardwarekeystoredialog.cpp +++ b/src/qt/hardwarekeystoredialog.cpp @@ -9,6 +9,7 @@ #include #include #include +#include class HardwareKeystoreDialogPriv { @@ -106,6 +107,23 @@ bool HardwareKeystoreDialog::SelectDevice(QString &fingerprint, QString& errorM return false; } +bool HardwareKeystoreDialog::AskDevice(QString &fingerprint, QString &message, QWidget *parent) +{ + QString errorMessage; + bool canceled = false; + if(SelectDevice(fingerprint, errorMessage, canceled, parent)) + return true; + + QMessageBox box(QMessageBox::Question, "Select ledger", message, QMessageBox::No | QMessageBox::Yes, parent); + + while(!canceled && box.exec() == QMessageBox::Yes) + { + if(SelectDevice(fingerprint, errorMessage, canceled, parent)) + return true; + } + return false; +} + void HardwareKeystoreDialog::on_cancelButton_clicked() { QDialog::reject(); diff --git a/src/qt/hardwarekeystoredialog.h b/src/qt/hardwarekeystoredialog.h index 0e13e7b3d2..74cfc10d42 100644 --- a/src/qt/hardwarekeystoredialog.h +++ b/src/qt/hardwarekeystoredialog.h @@ -52,6 +52,7 @@ class HardwareKeystoreDialog : public QDialog * @return true: device selected; false: device not selected */ static bool SelectDevice(QString& fingerprint, QString& errorMessage, bool& canceled, QWidget *parent = 0); + static bool AskDevice(QString& fingerprint, QString& message, QWidget *parent = 0); private Q_SLOTS: void on_cancelButton_clicked(); From 28ed6a15e268277cf7f6b97bf20ab08e86ebcd5f Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Wed, 30 Dec 2020 12:39:14 +0100 Subject: [PATCH 031/164] Ask device for sign tx --- src/qt/hardwarekeystoredialog.cpp | 9 +++++-- src/qt/hardwarekeystoredialog.h | 10 ++++++- src/qt/hardwaresigntxdialog.cpp | 45 ++++++++++++++++++++++--------- src/qt/hardwaresigntxdialog.h | 3 +++ 4 files changed, 51 insertions(+), 16 deletions(-) diff --git a/src/qt/hardwarekeystoredialog.cpp b/src/qt/hardwarekeystoredialog.cpp index fff5d7856d..7c3a3ef66c 100644 --- a/src/qt/hardwarekeystoredialog.cpp +++ b/src/qt/hardwarekeystoredialog.cpp @@ -87,6 +87,11 @@ bool HardwareKeystoreDialog::SelectDevice(QString &fingerprint, QString& errorM // Select a device if(listDeviceKey.length() > 0) { + if(fingerprint != "" && listDeviceKey.contains(fingerprint)) + { + return true; + } + HardwareKeystoreDialog keystoreDialog(listDeviceValue, parent); int result = keystoreDialog.exec(); if(result == QDialog::Accepted && @@ -107,14 +112,14 @@ bool HardwareKeystoreDialog::SelectDevice(QString &fingerprint, QString& errorM return false; } -bool HardwareKeystoreDialog::AskDevice(QString &fingerprint, QString &message, QWidget *parent) +bool HardwareKeystoreDialog::AskDevice(QString &fingerprint, const QString &title, const QString &message, QWidget *parent) { QString errorMessage; bool canceled = false; if(SelectDevice(fingerprint, errorMessage, canceled, parent)) return true; - QMessageBox box(QMessageBox::Question, "Select ledger", message, QMessageBox::No | QMessageBox::Yes, parent); + QMessageBox box(QMessageBox::Question, title, message, QMessageBox::No | QMessageBox::Yes, parent); while(!canceled && box.exec() == QMessageBox::Yes) { diff --git a/src/qt/hardwarekeystoredialog.h b/src/qt/hardwarekeystoredialog.h index 74cfc10d42..54691eae98 100644 --- a/src/qt/hardwarekeystoredialog.h +++ b/src/qt/hardwarekeystoredialog.h @@ -52,7 +52,15 @@ class HardwareKeystoreDialog : public QDialog * @return true: device selected; false: device not selected */ static bool SelectDevice(QString& fingerprint, QString& errorMessage, bool& canceled, QWidget *parent = 0); - static bool AskDevice(QString& fingerprint, QString& message, QWidget *parent = 0); + + /** + * @brief AskDevice Ask for hardware keystore device + * @param fingerprint Fingerprint of the device + * @param title Title of the message box to display + * @param message Message to display to the user + * @return true: device selected; false: device not selected + */ + static bool AskDevice(QString& fingerprint, const QString& title, const QString& message, QWidget *parent = 0); private Q_SLOTS: void on_cancelButton_clicked(); diff --git a/src/qt/hardwaresigntxdialog.cpp b/src/qt/hardwaresigntxdialog.cpp index a17ae33197..79e794226b 100644 --- a/src/qt/hardwaresigntxdialog.cpp +++ b/src/qt/hardwaresigntxdialog.cpp @@ -3,6 +3,7 @@ #include #include #include +#include class HardwareSignTxDialogPriv { @@ -70,20 +71,23 @@ void HardwareSignTxDialog::txChanged() void HardwareSignTxDialog::on_signButton_clicked() { - WaitMessageBox dlg(tr("Ledger Status"), tr("Confirm Transaction on your Ledger device..."), [this]() { - QString fingerprint = d->model->getFingerprint(); - QString psbt = d->psbt; - d->hexTx = ""; - d->complete = false; - bool ret = d->tool->signTx(fingerprint, psbt); - if(ret) ret &= d->tool->finalizePsbt(psbt, d->hexTx, d->complete); - if(d->complete) - { - ui->sendButton->setEnabled(true); - } - }, this); + if(askDevice()) + { + WaitMessageBox dlg(tr("Ledger Status"), tr("Confirm Transaction on your Ledger device..."), [this]() { + QString fingerprint = d->model->getFingerprint(); + QString psbt = d->psbt; + d->hexTx = ""; + d->complete = false; + bool ret = d->tool->signTx(fingerprint, psbt); + if(ret) ret &= d->tool->finalizePsbt(psbt, d->hexTx, d->complete); + if(d->complete) + { + ui->sendButton->setEnabled(true); + } + }, this); - dlg.exec(); + dlg.exec(); + } } void HardwareSignTxDialog::on_sendButton_clicked() @@ -91,3 +95,18 @@ void HardwareSignTxDialog::on_sendButton_clicked() if(d->tool->sendRawTransaction(d->hexTx)) QDialog::accept(); } + +bool HardwareSignTxDialog::askDevice() +{ + QString fingerprint = d->model->getFingerprint(); + QString title = tr("Connect Ledger"); + QString message = tr("Please insert your Ledger (%1). Verify the cable is connected and that no other application is using it.\n\nTry to connect again?"); + if(HardwareKeystoreDialog::AskDevice(fingerprint, title, message.arg(fingerprint), this)) + { + d->model->setFingerprint(fingerprint); + return true; + } + + d->model->setFingerprint(""); + return false; +} diff --git a/src/qt/hardwaresigntxdialog.h b/src/qt/hardwaresigntxdialog.h index 9eb2937ab5..e5fc4bf2c7 100644 --- a/src/qt/hardwaresigntxdialog.h +++ b/src/qt/hardwaresigntxdialog.h @@ -25,6 +25,9 @@ private Q_SLOTS: void on_sendButton_clicked(); void txChanged(); +private: + bool askDevice(); + private: Ui::HardwareSignTxDialog *ui; HardwareSignTxDialogPriv* d; From 349cbbaf71fedf96b102f0b065ecf5af5bb8a1d4 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Wed, 30 Dec 2020 13:26:33 +0100 Subject: [PATCH 032/164] Check hwi tool path exist for sing tx --- src/qt/hardwaresigntxdialog.cpp | 18 ++++++++++++++++++ src/qt/walletcontroller.cpp | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/qt/hardwaresigntxdialog.cpp b/src/qt/hardwaresigntxdialog.cpp index 79e794226b..726798cbcb 100644 --- a/src/qt/hardwaresigntxdialog.cpp +++ b/src/qt/hardwaresigntxdialog.cpp @@ -4,6 +4,10 @@ #include #include #include +#include +#include + +#include class HardwareSignTxDialogPriv { @@ -98,6 +102,20 @@ void HardwareSignTxDialog::on_sendButton_clicked() bool HardwareSignTxDialog::askDevice() { + // Check if the HWI tool exist + QString hwiToolPath = GUIUtil::getHwiToolPath(); + if(!QFile::exists(hwiToolPath)) + { + QMessageBox msgBox(this); + msgBox.setWindowTitle(tr("HWI tool not found")); + msgBox.setTextFormat(Qt::RichText); + msgBox.setText(tr("HWI tool not found at path \"%1\".
Please download it from %2 and add the path to the settings.").arg(hwiToolPath, QTUM_HWI_TOOL)); + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.exec(); + return false; + } + + // Ask for ledger QString fingerprint = d->model->getFingerprint(); QString title = tr("Connect Ledger"); QString message = tr("Please insert your Ledger (%1). Verify the cable is connected and that no other application is using it.\n\nTry to connect again?"); diff --git a/src/qt/walletcontroller.cpp b/src/qt/walletcontroller.cpp index 40a4344bf5..d3e5c7820c 100644 --- a/src/qt/walletcontroller.cpp +++ b/src/qt/walletcontroller.cpp @@ -250,7 +250,7 @@ void CreateWalletActivity::askDevice() QMessageBox msgBox(m_parent_widget); msgBox.setWindowTitle(tr("HWI tool not found")); msgBox.setTextFormat(Qt::RichText); - msgBox.setText(tr("HWI tool not found at path \"%1\".
Please download it from %2.").arg(hwiToolPath, QTUM_HWI_TOOL)); + msgBox.setText(tr("HWI tool not found at path \"%1\".
Please download it from %2 and add the path to the settings.").arg(hwiToolPath, QTUM_HWI_TOOL)); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.exec(); From 9b6814bfc4e6d8d033a6bc65a2d27753ee578eb2 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 31 Dec 2020 10:14:30 +0100 Subject: [PATCH 033/164] Add sign failed message for sing with hardware --- src/qt/hardwaresigntxdialog.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/qt/hardwaresigntxdialog.cpp b/src/qt/hardwaresigntxdialog.cpp index 726798cbcb..c42b804701 100644 --- a/src/qt/hardwaresigntxdialog.cpp +++ b/src/qt/hardwaresigntxdialog.cpp @@ -91,6 +91,11 @@ void HardwareSignTxDialog::on_signButton_clicked() }, this); dlg.exec(); + + if(!d->complete) + { + QMessageBox::warning(this, tr("Sign failed"), tr("The transaction has no a complete set of signatures.")); + } } } From 4ea00c06ecd14ec040058d9cc383bae62d241275 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 31 Dec 2020 13:36:01 +0100 Subject: [PATCH 034/164] Add import addresses in hardware sign tx dialog --- src/qt/forms/hardwarekeystoredialog.ui | 6 +-- src/qt/forms/hardwaresigntxdialog.ui | 7 +++ src/qt/hardwarekeystoredialog.cpp | 2 +- src/qt/hardwarekeystoredialog.h | 2 +- src/qt/hardwaresigntxdialog.cpp | 62 ++++++++++++++++++++++++++ src/qt/hardwaresigntxdialog.h | 2 + 6 files changed, 76 insertions(+), 5 deletions(-) diff --git a/src/qt/forms/hardwarekeystoredialog.ui b/src/qt/forms/hardwarekeystoredialog.ui index 568da3266d..f13923bec7 100644 --- a/src/qt/forms/hardwarekeystoredialog.ui +++ b/src/qt/forms/hardwarekeystoredialog.ui @@ -86,14 +86,14 @@ - Cancel + &Cancel - + - Next + &OK diff --git a/src/qt/forms/hardwaresigntxdialog.ui b/src/qt/forms/hardwaresigntxdialog.ui index 4978bafcb9..edbfd597fb 100644 --- a/src/qt/forms/hardwaresigntxdialog.ui +++ b/src/qt/forms/hardwaresigntxdialog.ui @@ -113,6 +113,13 @@ 30 + + + + Import Addresses + + + diff --git a/src/qt/hardwarekeystoredialog.cpp b/src/qt/hardwarekeystoredialog.cpp index 7c3a3ef66c..753d5606dc 100644 --- a/src/qt/hardwarekeystoredialog.cpp +++ b/src/qt/hardwarekeystoredialog.cpp @@ -134,7 +134,7 @@ void HardwareKeystoreDialog::on_cancelButton_clicked() QDialog::reject(); } -void HardwareKeystoreDialog::on_nextButton_clicked() +void HardwareKeystoreDialog::on_okButton_clicked() { QDialog::accept(); } diff --git a/src/qt/hardwarekeystoredialog.h b/src/qt/hardwarekeystoredialog.h index 54691eae98..82aa55616e 100644 --- a/src/qt/hardwarekeystoredialog.h +++ b/src/qt/hardwarekeystoredialog.h @@ -64,7 +64,7 @@ class HardwareKeystoreDialog : public QDialog private Q_SLOTS: void on_cancelButton_clicked(); - void on_nextButton_clicked(); + void on_okButton_clicked(); private: Ui::HardwareKeystoreDialog *ui; diff --git a/src/qt/hardwaresigntxdialog.cpp b/src/qt/hardwaresigntxdialog.cpp index c42b804701..dfc4ee1f4f 100644 --- a/src/qt/hardwaresigntxdialog.cpp +++ b/src/qt/hardwaresigntxdialog.cpp @@ -35,6 +35,8 @@ HardwareSignTxDialog::HardwareSignTxDialog(const QString &tx, QWidget *parent) : ui->textEditTxData->setReadOnly(tx != ""); ui->textEditTxDetails->setReadOnly(true); + setStyleSheet(""); + // Connect slots connect(ui->textEditTxData, &QTextEdit::textChanged, this, &HardwareSignTxDialog::txChanged); } @@ -55,6 +57,14 @@ void HardwareSignTxDialog::setModel(WalletModel *model) d->model = model; d->tool->setModel(model); txChanged(); + if(!d->model->wallet().privateKeysDisabled()) + { + ui->textEditTxData->setEnabled(false); + ui->textEditTxDetails->setEnabled(false); + ui->importButton->setEnabled(false); + ui->signButton->setEnabled(false); + ui->sendButton->setEnabled(false); + } } void HardwareSignTxDialog::txChanged() @@ -133,3 +143,55 @@ bool HardwareSignTxDialog::askDevice() d->model->setFingerprint(""); return false; } + +void HardwareSignTxDialog::on_importButton_clicked() +{ + bool rescan, importPKH, importP2SH, importBech32; + if(askDevice() && importAddressesData(rescan, importPKH, importP2SH, importBech32)) + { + bool imported = false; + QString fingerprint = d->model->getFingerprint(); + + // Import addresses from hardware wallet + if(importPKH) + { + QString desc; + if(d->tool->getKeyPoolPKH(fingerprint, desc)) + { + imported |= d->tool->importMulti(desc); + } + } + if(importP2SH) + { + QString desc; + if(d->tool->getKeyPoolP2SH(fingerprint, desc)) + { + imported |= d->tool->importMulti(desc); + } + } + if(importP2SH) + { + QString desc; + if(d->tool->getKeyPoolP2SH(fingerprint, desc)) + { + imported |= d->tool->importMulti(desc); + } + } + + // Rescan the chain + if(imported && rescan) + { + d->tool->rescanBlockchain(); + } + } +} + +bool HardwareSignTxDialog::importAddressesData(bool &rescan, bool &importPKH, bool &importP2SH, bool &importBech32) +{ + // Get import addresses data + rescan = true; + importPKH = true; + importP2SH = true; + importBech32 = true; + return true; +} diff --git a/src/qt/hardwaresigntxdialog.h b/src/qt/hardwaresigntxdialog.h index e5fc4bf2c7..9cccd30166 100644 --- a/src/qt/hardwaresigntxdialog.h +++ b/src/qt/hardwaresigntxdialog.h @@ -23,10 +23,12 @@ private Q_SLOTS: void on_cancelButton_clicked(); void on_signButton_clicked(); void on_sendButton_clicked(); + void on_importButton_clicked(); void txChanged(); private: bool askDevice(); + bool importAddressesData(bool& rescan, bool& importPKH, bool& importP2SH, bool& importBech32); private: Ui::HardwareSignTxDialog *ui; From 370e718978462037eb361bcb8b6e0777e67eff97 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 11 Jan 2021 14:07:02 +0100 Subject: [PATCH 035/164] Update derivation path dialog --- src/qt/derivationpathdialog.cpp | 29 +++++++++++- src/qt/derivationpathdialog.h | 7 ++- src/qt/forms/derivationpathdialog.ui | 70 ++++++++++++++-------------- src/qt/hardwaresigntxdialog.cpp | 62 +++++++++--------------- src/qt/walletcontroller.cpp | 2 +- src/qt/walletmodel.cpp | 27 ++++++----- src/qt/walletmodel.h | 7 ++- 7 files changed, 108 insertions(+), 96 deletions(-) diff --git a/src/qt/derivationpathdialog.cpp b/src/qt/derivationpathdialog.cpp index 21df98cc13..e515a33600 100644 --- a/src/qt/derivationpathdialog.cpp +++ b/src/qt/derivationpathdialog.cpp @@ -6,6 +6,13 @@ DerivationPathDialog::DerivationPathDialog(QWidget *parent) : ui(new Ui::DerivationPathDialog) { ui->setupUi(this); + + // Connect signal and slots + QObject::connect(ui->cbRescan, SIGNAL(clicked()), this, SLOT(updateButtons())); + QObject::connect(ui->cbLegacy, SIGNAL(clicked()), this, SLOT(updateButtons())); + QObject::connect(ui->cbP2SH, SIGNAL(clicked()), this, SLOT(updateButtons())); + QObject::connect(ui->cbSegWit, SIGNAL(clicked()), this, SLOT(updateButtons())); + updateButtons(); } DerivationPathDialog::~DerivationPathDialog() @@ -13,7 +20,27 @@ DerivationPathDialog::~DerivationPathDialog() delete ui; } -void DerivationPathDialog::on_backButton_clicked() +void DerivationPathDialog::on_cancelButton_clicked() { QDialog::reject(); } + +void DerivationPathDialog::on_okButton_clicked() +{ + QDialog::accept(); +} + +bool DerivationPathDialog::importAddressesData(bool &rescan, bool &importPKH, bool &importP2SH, bool &importBech32) +{ + rescan = ui->cbRescan->isChecked(); + importPKH = ui->cbLegacy->isChecked(); + importP2SH = ui->cbP2SH->isChecked(); + importBech32 = ui->cbSegWit->isChecked(); + return rescan || importPKH || importP2SH || importBech32; +} + +void DerivationPathDialog::updateButtons() +{ + bool enabled = ui->cbRescan->isChecked() || ui->cbLegacy->isChecked() || ui->cbP2SH->isChecked() || ui->cbSegWit->isChecked(); + ui->okButton->setEnabled(enabled); +} diff --git a/src/qt/derivationpathdialog.h b/src/qt/derivationpathdialog.h index a756238de0..e175914374 100644 --- a/src/qt/derivationpathdialog.h +++ b/src/qt/derivationpathdialog.h @@ -13,10 +13,15 @@ class DerivationPathDialog : public QDialog public: explicit DerivationPathDialog(QWidget *parent = nullptr); + ~DerivationPathDialog(); + bool importAddressesData(bool& rescan, bool& importPKH, bool& importP2SH, bool& importBech32); + private Q_SLOTS: - void on_backButton_clicked(); + void on_cancelButton_clicked(); + void on_okButton_clicked(); + void updateButtons(); private: Ui::DerivationPathDialog *ui; diff --git a/src/qt/forms/derivationpathdialog.ui b/src/qt/forms/derivationpathdialog.ui index a71d161613..4643faf11c 100644 --- a/src/qt/forms/derivationpathdialog.ui +++ b/src/qt/forms/derivationpathdialog.ui @@ -6,8 +6,8 @@ 0 0 - 565 - 442 + 501 + 338 @@ -56,7 +56,10 @@ - + + + true + legacy (p2pkh) @@ -66,17 +69,23 @@ - + p2sh-segwit (p2wpkh-p2sh) + + true + - + native segwit (p2wpkh) + + true + @@ -88,7 +97,7 @@ Qt::Vertical - QSizePolicy::Fixed + QSizePolicy::Expanding @@ -99,39 +108,28 @@ - - - You can override the suggested derivation path. If you are not sure what this is, leave this field unchanged. - - - true - - - - - - - m/44'/88'/0' + + + Rescan the local blockchain for wallet related transactions. + + + + + rescan blockchain + + + true + + + +
- - - - Qt::Vertical - - - - 20 - 40 - - - - @@ -158,16 +156,16 @@ - + - Back + &OK - + - Next + &Cancel diff --git a/src/qt/hardwaresigntxdialog.cpp b/src/qt/hardwaresigntxdialog.cpp index dfc4ee1f4f..cad24fdfd0 100644 --- a/src/qt/hardwaresigntxdialog.cpp +++ b/src/qt/hardwaresigntxdialog.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include @@ -147,51 +148,30 @@ bool HardwareSignTxDialog::askDevice() void HardwareSignTxDialog::on_importButton_clicked() { bool rescan, importPKH, importP2SH, importBech32; - if(askDevice() && importAddressesData(rescan, importPKH, importP2SH, importBech32)) + if(importAddressesData(rescan, importPKH, importP2SH, importBech32)) { - bool imported = false; - QString fingerprint = d->model->getFingerprint(); - - // Import addresses from hardware wallet - if(importPKH) - { - QString desc; - if(d->tool->getKeyPoolPKH(fingerprint, desc)) - { - imported |= d->tool->importMulti(desc); - } - } - if(importP2SH) - { - QString desc; - if(d->tool->getKeyPoolP2SH(fingerprint, desc)) - { - imported |= d->tool->importMulti(desc); - } - } - if(importP2SH) - { - QString desc; - if(d->tool->getKeyPoolP2SH(fingerprint, desc)) - { - imported |= d->tool->importMulti(desc); - } - } - - // Rescan the chain - if(imported && rescan) - { - d->tool->rescanBlockchain(); - } + d->model->importAddressesData(rescan, importPKH, importP2SH, importBech32); + QDialog::accept(); } } bool HardwareSignTxDialog::importAddressesData(bool &rescan, bool &importPKH, bool &importP2SH, bool &importBech32) { - // Get import addresses data - rescan = true; - importPKH = true; - importP2SH = true; - importBech32 = true; - return true; + // Init import addresses data + bool ret = true; + rescan = false; + importPKH = false; + importP2SH = false; + importBech32 = false; + + // Get list to import + DerivationPathDialog dlg(this); + ret &= dlg.exec() == QDialog::Accepted; + if(ret) ret &= dlg.importAddressesData(rescan, importPKH, importP2SH, importBech32); + + // Ask for device + bool fDevice = importPKH || importP2SH || importBech32; + if(fDevice) ret &= askDevice(); + + return ret; } diff --git a/src/qt/walletcontroller.cpp b/src/qt/walletcontroller.cpp index d3e5c7820c..d4edc00aa4 100644 --- a/src/qt/walletcontroller.cpp +++ b/src/qt/walletcontroller.cpp @@ -297,7 +297,7 @@ void CreateWalletActivity::finish() if(m_wallet_model) { m_wallet_model->setFingerprint(m_fingerprint); - m_wallet_model->setHardwareWalletInitRequired(true); + m_wallet_model->importAddressesData(); } } diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index ff9c3ddde5..e108bea140 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -842,16 +842,6 @@ void WalletModel::setFingerprint(const QString &value) fingerprint = value; } -bool WalletModel::getHardwareWalletInitRequired() const -{ - return hardwareWalletInitRequired; -} - -void WalletModel::setHardwareWalletInitRequired(bool value) -{ - hardwareWalletInitRequired = value; -} - void WalletModel::checkHardwareWallet() { if(hardwareWalletInitRequired) @@ -864,27 +854,36 @@ void WalletModel::checkHardwareWallet() { // Setup key pool QString pkhdesc; - if(hwiTool.getKeyPoolPKH(fingerprint, pkhdesc)) + if(importPKH && hwiTool.getKeyPoolPKH(fingerprint, pkhdesc)) { hwiTool.importMulti(pkhdesc); } QString p2shdesc; - if(hwiTool.getKeyPoolP2SH(fingerprint, p2shdesc)) + if(importP2SH && hwiTool.getKeyPoolP2SH(fingerprint, p2shdesc)) { hwiTool.importMulti(p2shdesc); } QString bech32desc; - if(hwiTool.getKeyPoolP2SH(fingerprint, bech32desc)) + if(importBech32 && hwiTool.getKeyPoolP2SH(fingerprint, bech32desc)) { hwiTool.importMulti(bech32desc); } // Rescan the chain - hwiTool.rescanBlockchain(); + if(rescan) hwiTool.rescanBlockchain(); } hardwareWalletInitRequired = false; } } + +void WalletModel::importAddressesData(bool _rescan, bool _importPKH, bool _importP2SH, bool _importBech32) +{ + rescan = _rescan; + importPKH = _importPKH; + importP2SH = _importP2SH; + importBech32 = _importBech32; + hardwareWalletInitRequired = true; +} diff --git a/src/qt/walletmodel.h b/src/qt/walletmodel.h index 3c96e9e496..a718c80632 100644 --- a/src/qt/walletmodel.h +++ b/src/qt/walletmodel.h @@ -182,8 +182,7 @@ class WalletModel : public QObject void setFingerprint(const QString &value); // Get or set hardware wallet init required (only for hardware wallet applicable) - bool getHardwareWalletInitRequired() const; - void setHardwareWalletInitRequired(bool value); + void importAddressesData(bool rescan = true, bool importPKH = true, bool importP2SH = true, bool importBech32 = true); private: std::unique_ptr m_wallet; @@ -229,6 +228,10 @@ class WalletModel : public QObject QString fingerprint; std::atomic hardwareWalletInitRequired{false}; + bool rescan{true}; + bool importPKH{true}; + bool importP2SH{true}; + bool importBech32{true}; QThread t; WalletWorker *worker; From 2fd023e52280082144d21b462843fe876e6cbead Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 11 Jan 2021 15:14:08 +0100 Subject: [PATCH 036/164] Update send tx button for hw --- src/qt/hardwaresigntxdialog.cpp | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/qt/hardwaresigntxdialog.cpp b/src/qt/hardwaresigntxdialog.cpp index cad24fdfd0..a60138cd20 100644 --- a/src/qt/hardwaresigntxdialog.cpp +++ b/src/qt/hardwaresigntxdialog.cpp @@ -1,3 +1,7 @@ +#if defined(HAVE_CONFIG_H) +#include +#endif + #include #include #include @@ -7,6 +11,7 @@ #include #include #include +#include #include @@ -112,8 +117,23 @@ void HardwareSignTxDialog::on_signButton_clicked() void HardwareSignTxDialog::on_sendButton_clicked() { - if(d->tool->sendRawTransaction(d->hexTx)) - QDialog::accept(); + QString questionString = tr("Are you sure you want to broadcast the transaction?
"); + SendConfirmationDialog confirmationDialog(tr("Confirm broadcast transaction."), questionString, "", "", SEND_CONFIRM_DELAY, tr("Send"), this); + confirmationDialog.exec(); + QMessageBox::StandardButton retval = (QMessageBox::StandardButton)confirmationDialog.result(); + if(retval == QMessageBox::Yes) + { + if(d->tool->sendRawTransaction(d->hexTx)) + { + QDialog::accept(); + } + else + { + QString errorMessage = d->tool->errorMessage(); + if(errorMessage.isEmpty()) errorMessage = tr("Unknown transaction error"); + QMessageBox::warning(this, tr("Broadcast transaction"), errorMessage); + } + } } bool HardwareSignTxDialog::askDevice() From b3dc868326d0101bfd1d22a714d038af429b47b6 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Tue, 12 Jan 2021 12:28:56 +0100 Subject: [PATCH 037/164] Add wait for started --- src/qt/qtumhwitool.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 8174801eeb..5375f63c76 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -181,7 +181,10 @@ void QtumHwiTool::wait() { if(d->fStarted) { - d->process.waitForFinished(-1); + if(d->process.waitForStarted()) + { + d->process.waitForFinished(-1); + } d->strStdout = d->process.readAllStandardOutput(); d->strError = d->process.readAllStandardError(); d->fStarted = false; From 7de14cd0cf2cedfaf471125c798dad511f4a5b5b Mon Sep 17 00:00:00 2001 From: Toni Markov Date: Tue, 12 Jan 2021 12:38:47 +0100 Subject: [PATCH 038/164] Add amount and fee field in hardware sign tx dialog --- src/qt/forms/hardwaresigntxdialog.ui | 22 +++++++++++++++ src/qt/hardwaresigntxdialog.cpp | 42 ++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/src/qt/forms/hardwaresigntxdialog.ui b/src/qt/forms/hardwaresigntxdialog.ui index edbfd597fb..3d88406270 100644 --- a/src/qt/forms/hardwaresigntxdialog.ui +++ b/src/qt/forms/hardwaresigntxdialog.ui @@ -83,6 +83,20 @@ + + + + true + + + + + + + true + + + @@ -165,6 +179,14 @@ + + + BitcoinAmountField + QLineEdit +
qt/bitcoinamountfield.h
+ 1 +
+
diff --git a/src/qt/hardwaresigntxdialog.cpp b/src/qt/hardwaresigntxdialog.cpp index a60138cd20..7c09271d1a 100644 --- a/src/qt/hardwaresigntxdialog.cpp +++ b/src/qt/hardwaresigntxdialog.cpp @@ -12,8 +12,13 @@ #include #include #include +#include #include +#include +#include +#include +#include class HardwareSignTxDialogPriv { @@ -84,6 +89,43 @@ void HardwareSignTxDialog::txChanged() d->complete = false; bool isOk = d->tool->decodePsbt(psbt, decoded); ui->textEditTxDetails->setText(decoded); + + if(!decoded.isEmpty()) + { + CAmount amount = 0; + CAmount fee; + + QJsonDocument doc = QJsonDocument::fromJson(decoded.toUtf8()); + QJsonObject jsonData = doc.object(); + + QJsonObject tx = jsonData.value("tx").toObject(); + QJsonArray vouts = tx.value("vout").toArray(); + + for (int i = 0; i < vouts.count(); i++) { + QJsonObject vout = vouts.at(i).toObject(); + QJsonObject scriptPubKey = vout.value("scriptPubKey").toObject(); + QJsonArray addresses = scriptPubKey.value("addresses").toArray(); + std::string address = addresses.at(0).toString().toStdString(); + + if(!d->model->wallet().isMineAddress(address)) + { + CAmount amountValue; + BitcoinUnits::parse(BitcoinUnits::BTC, vout.value("value").toVariant().toString(), &amountValue); + amount += amountValue; + } + } + + BitcoinUnits::parse(BitcoinUnits::BTC, jsonData.value("fee").toVariant().toString(), &fee); + + ui->lineEditAmount->setValue(amount); + ui->lineEditFee->setValue(fee); + } + else + { + ui->lineEditAmount->clear(); + ui->lineEditFee->clear(); + } + ui->signButton->setEnabled(isOk); ui->sendButton->setEnabled(false); } From f28983f5194628c4cfdd308c964c62af161daa48 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Tue, 12 Jan 2021 13:47:42 +0100 Subject: [PATCH 039/164] Update layout hardware sign tx dialog --- src/qt/forms/hardwaresigntxdialog.ui | 102 +++++++++++++++++++++++---- src/qt/hardwaresigntxdialog.cpp | 20 ++++-- 2 files changed, 101 insertions(+), 21 deletions(-) diff --git a/src/qt/forms/hardwaresigntxdialog.ui b/src/qt/forms/hardwaresigntxdialog.ui index 3d88406270..ad545a1384 100644 --- a/src/qt/forms/hardwaresigntxdialog.ui +++ b/src/qt/forms/hardwaresigntxdialog.ui @@ -6,7 +6,7 @@ 0 0 - 607 + 590 396 @@ -47,6 +47,92 @@ 30 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Amount: + + + + + + + + 0 + 0 + + + + true + + + + + + + + 0 + 0 + + + + Fee: + + + + + + + + 0 + 0 + + + + true + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Minimum + + + + 20 + 10 + + + + @@ -83,20 +169,6 @@ - - - - true - - - - - - - true - - - diff --git a/src/qt/hardwaresigntxdialog.cpp b/src/qt/hardwaresigntxdialog.cpp index 7c09271d1a..26c4129939 100644 --- a/src/qt/hardwaresigntxdialog.cpp +++ b/src/qt/hardwaresigntxdialog.cpp @@ -89,8 +89,10 @@ void HardwareSignTxDialog::txChanged() d->complete = false; bool isOk = d->tool->decodePsbt(psbt, decoded); ui->textEditTxDetails->setText(decoded); + ui->signButton->setEnabled(isOk); + ui->sendButton->setEnabled(false); - if(!decoded.isEmpty()) + if(isOk && !decoded.isEmpty()) { CAmount amount = 0; CAmount fee; @@ -105,9 +107,18 @@ void HardwareSignTxDialog::txChanged() QJsonObject vout = vouts.at(i).toObject(); QJsonObject scriptPubKey = vout.value("scriptPubKey").toObject(); QJsonArray addresses = scriptPubKey.value("addresses").toArray(); - std::string address = addresses.at(0).toString().toStdString(); + bool sendToFound = false; + for(int j = 0; j < addresses.count(); j++) + { + std::string address = addresses.at(i).toString().toStdString(); + if(!d->model->wallet().isMineAddress(address)) + { + sendToFound = true; + break; + } + } - if(!d->model->wallet().isMineAddress(address)) + if(sendToFound) { CAmount amountValue; BitcoinUnits::parse(BitcoinUnits::BTC, vout.value("value").toVariant().toString(), &amountValue); @@ -125,9 +136,6 @@ void HardwareSignTxDialog::txChanged() ui->lineEditAmount->clear(); ui->lineEditFee->clear(); } - - ui->signButton->setEnabled(isOk); - ui->sendButton->setEnabled(false); } } From 7a53032f1b7c65fa57735b88e475887f96613f4c Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Tue, 12 Jan 2021 14:39:07 +0100 Subject: [PATCH 040/164] Add comments in hardware sign tx dialog --- src/qt/hardwaresigntxdialog.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/qt/hardwaresigntxdialog.cpp b/src/qt/hardwaresigntxdialog.cpp index 26c4129939..d1ecec3eea 100644 --- a/src/qt/hardwaresigntxdialog.cpp +++ b/src/qt/hardwaresigntxdialog.cpp @@ -84,6 +84,7 @@ void HardwareSignTxDialog::txChanged() QString decoded; if(psbt != d->psbt) { + // Decode psbt d->psbt = psbt; d->hexTx = ""; d->complete = false; @@ -92,6 +93,7 @@ void HardwareSignTxDialog::txChanged() ui->signButton->setEnabled(isOk); ui->sendButton->setEnabled(false); + // Determine amount and fee if(isOk && !decoded.isEmpty()) { CAmount amount = 0; @@ -103,6 +105,7 @@ void HardwareSignTxDialog::txChanged() QJsonObject tx = jsonData.value("tx").toObject(); QJsonArray vouts = tx.value("vout").toArray(); + // Determine the amount for (int i = 0; i < vouts.count(); i++) { QJsonObject vout = vouts.at(i).toObject(); QJsonObject scriptPubKey = vout.value("scriptPubKey").toObject(); @@ -110,7 +113,7 @@ void HardwareSignTxDialog::txChanged() bool sendToFound = false; for(int j = 0; j < addresses.count(); j++) { - std::string address = addresses.at(i).toString().toStdString(); + std::string address = addresses.at(j).toString().toStdString(); if(!d->model->wallet().isMineAddress(address)) { sendToFound = true; @@ -126,6 +129,7 @@ void HardwareSignTxDialog::txChanged() } } + // Determine the fee BitcoinUnits::parse(BitcoinUnits::BTC, jsonData.value("fee").toVariant().toString(), &fee); ui->lineEditAmount->setValue(amount); @@ -133,6 +137,7 @@ void HardwareSignTxDialog::txChanged() } else { + // Cleat the fields ui->lineEditAmount->clear(); ui->lineEditFee->clear(); } @@ -143,6 +148,7 @@ void HardwareSignTxDialog::on_signButton_clicked() { if(askDevice()) { + // Sign transaction with hardware WaitMessageBox dlg(tr("Ledger Status"), tr("Confirm Transaction on your Ledger device..."), [this]() { QString fingerprint = d->model->getFingerprint(); QString psbt = d->psbt; @@ -167,6 +173,7 @@ void HardwareSignTxDialog::on_signButton_clicked() void HardwareSignTxDialog::on_sendButton_clicked() { + // Send transaction QString questionString = tr("Are you sure you want to broadcast the transaction?
"); SendConfirmationDialog confirmationDialog(tr("Confirm broadcast transaction."), questionString, "", "", SEND_CONFIRM_DELAY, tr("Send"), this); confirmationDialog.exec(); @@ -179,6 +186,7 @@ void HardwareSignTxDialog::on_sendButton_clicked() } else { + // Display error message QString errorMessage = d->tool->errorMessage(); if(errorMessage.isEmpty()) errorMessage = tr("Unknown transaction error"); QMessageBox::warning(this, tr("Broadcast transaction"), errorMessage); @@ -217,6 +225,7 @@ bool HardwareSignTxDialog::askDevice() void HardwareSignTxDialog::on_importButton_clicked() { + // Import addresses and rescan bool rescan, importPKH, importP2SH, importBech32; if(importAddressesData(rescan, importPKH, importP2SH, importBech32)) { From 440283eb1731ce103d86e766763342a064443b7c Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Wed, 13 Jan 2021 10:49:26 +0100 Subject: [PATCH 041/164] Fix windows build --- src/qt/hardwaresigntxdialog.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/qt/hardwaresigntxdialog.cpp b/src/qt/hardwaresigntxdialog.cpp index d1ecec3eea..f61824fbc2 100644 --- a/src/qt/hardwaresigntxdialog.cpp +++ b/src/qt/hardwaresigntxdialog.cpp @@ -14,6 +14,7 @@ #include #include +#include #include #include #include From 4e337eda3b3b5a10c2fb06eecaeb322bcc3d2c3d Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Wed, 13 Jan 2021 13:30:08 +0100 Subject: [PATCH 042/164] Fix hwi tool send call --- src/qt/qtumhwitool.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 5375f63c76..a2116a2819 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -39,7 +39,7 @@ class QtumHwiToolPriv QStringList mandatoryFinalize = QStringList() << PARAM_PSBT; cmdFinalize = new ExecRPCCommand("finalizepsbt", mandatoryFinalize, QStringList(), QMap(), parent); QStringList mandatorySend = QStringList() << PARAM_HEXTX; - cmdSend = new ExecRPCCommand("finalizepsbt", mandatorySend, QStringList(), QMap(), parent); + cmdSend = new ExecRPCCommand("sendrawtransaction", mandatorySend, QStringList(), QMap(), parent); QStringList mandatoryDecode = QStringList() << PARAM_PSBT; cmdDecode = new ExecRPCCommand("decodepsbt", mandatoryDecode, QStringList(), QMap(), parent); if(gArgs.GetChainName() != CBaseChainParams::MAIN) From 52d9c6a3cfb7bc5c6003a13b4cbadbef7290ab9a Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 14 Jan 2021 11:57:00 +0100 Subject: [PATCH 043/164] Update hardware sign tx dialog --- src/qt/forms/hardwaresigntxdialog.ui | 2 +- src/qt/hardwaresigntxdialog.cpp | 3 ++- src/qt/optionsdialog.cpp | 4 ++-- src/qt/qtumhwitool.cpp | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/qt/forms/hardwaresigntxdialog.ui b/src/qt/forms/hardwaresigntxdialog.ui index ad545a1384..44e7fc41fe 100644 --- a/src/qt/forms/hardwaresigntxdialog.ui +++ b/src/qt/forms/hardwaresigntxdialog.ui @@ -235,7 +235,7 @@ false - Send + Broadcast
diff --git a/src/qt/hardwaresigntxdialog.cpp b/src/qt/hardwaresigntxdialog.cpp index f61824fbc2..afeda56ea4 100644 --- a/src/qt/hardwaresigntxdialog.cpp +++ b/src/qt/hardwaresigntxdialog.cpp @@ -160,6 +160,7 @@ void HardwareSignTxDialog::on_signButton_clicked() if(d->complete) { ui->sendButton->setEnabled(true); + on_sendButton_clicked(); } }, this); @@ -176,7 +177,7 @@ void HardwareSignTxDialog::on_sendButton_clicked() { // Send transaction QString questionString = tr("Are you sure you want to broadcast the transaction?
"); - SendConfirmationDialog confirmationDialog(tr("Confirm broadcast transaction."), questionString, "", "", SEND_CONFIRM_DELAY, tr("Send"), this); + SendConfirmationDialog confirmationDialog(tr("Confirm broadcast transaction."), questionString, "", "", SEND_CONFIRM_DELAY, tr("Broadcast"), this); confirmationDialog.exec(); QMessageBox::StandardButton retval = (QMessageBox::StandardButton)confirmationDialog.result(); if(retval == QMessageBox::Yes) diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp index 3caa874c24..a8a0983e95 100644 --- a/src/qt/optionsdialog.cpp +++ b/src/qt/optionsdialog.cpp @@ -357,8 +357,8 @@ void OptionsDialog::on_cancelButton_clicked() void OptionsDialog::on_toolHWIPath_clicked() { QString filename = GUIUtil::getOpenFileName(this, - tr("Select HWI tool path"), QString(), - tr("HWI tool (*.exe *.py)"), NULL); + tr("Select HWI tool path"), QDir::homePath(), + tr("HWI tool (hwi hwi.py hwi.exe)"), NULL); if (filename.isEmpty()) return; diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index a2116a2819..55e0a40526 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -68,7 +68,7 @@ HWDevice::HWDevice() QString HWDevice::toString() const { - return QString("[ %1 \\ %2 \\ %3 \\ %4 ]").arg(type, model, path, fingerprint); + return QString("[ %1 \\ %2 \\ %3 ]").arg(type, model, fingerprint); } bool HWDevice::isValid() const From 7440bf3b1d26fd85b838bd1d69dda200bf77ab88 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 18 Jan 2021 11:11:23 +0100 Subject: [PATCH 044/164] Add ledger res --- src/Makefile.qt.include | 8 +- src/qt/bitcoin.qrc | 5 + src/qt/res/ledger/nanos_app.hex | 2743 ++++++++++++++++++++++++++++ src/qt/res/ledger/nanos_delete.txt | 1 + src/qt/res/ledger/nanos_load.txt | 1 + 5 files changed, 2756 insertions(+), 2 deletions(-) create mode 100644 src/qt/res/ledger/nanos_app.hex create mode 100644 src/qt/res/ledger/nanos_delete.txt create mode 100644 src/qt/res/ledger/nanos_load.txt diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index a4561b6a3f..f8c770e390 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -636,6 +636,10 @@ qt/res/styles/theme3/app-icons/down_arrow_unit.png \ qt/res/styles/theme3/app-icons/splash_bg.png \ qt/res/styles/theme3/app-icons/bg.png +RES_LEDGER = qt/res/ledger/nanos_app.hex \ +qt/res/ledger/nanos_load.txt \ +qt/res/ledger/nanos_delete.txt + BITCOIN_RC = qt/res/bitcoin-qt-res.rc BITCOIN_QT_INCLUDES = -DQT_NO_KEYWORDS @@ -646,7 +650,7 @@ qt_libbitcoinqt_a_CXXFLAGS = $(AM_CXXFLAGS) $(QT_PIE_FLAGS) qt_libbitcoinqt_a_OBJCXXFLAGS = $(AM_OBJCXXFLAGS) $(QT_PIE_FLAGS) qt_libbitcoinqt_a_SOURCES = $(BITCOIN_QT_CPP) $(BITCOIN_QT_H) $(QT_FORMS_UI) \ - $(QT_QRC) $(QT_QRC_LOCALE) $(QT_TS) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) $(RES_TOKENS) $(RES_STYLES) + $(QT_QRC) $(QT_QRC_LOCALE) $(QT_TS) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) $(RES_TOKENS) $(RES_STYLES) $(RES_LEDGER) if TARGET_DARWIN qt_libbitcoinqt_a_SOURCES += $(BITCOIN_MM) endif @@ -703,7 +707,7 @@ $(QT_QRC_LOCALE_CPP): $(QT_QRC_LOCALE) $(QT_QM) $(SED) -e '/^\*\*.*Created:/d' -e '/^\*\*.*by:/d' > $@ @rm $(@D)/temp_$( $@ diff --git a/src/qt/bitcoin.qrc b/src/qt/bitcoin.qrc index ac8d782abe..d6f19a4313 100644 --- a/src/qt/bitcoin.qrc +++ b/src/qt/bitcoin.qrc @@ -240,4 +240,9 @@ res/styles/theme3/app-icons/bg.png res/styles/theme3/app-icons/splash_bg.png + + res/ledger/nanos_app.hex + res/ledger/nanos_load.txt + res/ledger/nanos_delete.txt + diff --git a/src/qt/res/ledger/nanos_app.hex b/src/qt/res/ledger/nanos_app.hex new file mode 100644 index 0000000000..2d3216728f --- /dev/null +++ b/src/qt/res/ledger/nanos_app.hex @@ -0,0 +1,2743 @@ +:02000004C0D06A +:1000000010B5044662B605F05BF8002C0DD0012057 +:1000100000022168814205D1606801280AD1A068E8 +:10002000002803D104F01CFF02E0002004F03CFF94 +:10003000002010BD204604F0B9FFF0B581B00446A1 +:100040000020002A1CD00B780A2B19D89D0001260D +:100050003543954214D82370002B10D00096271DED +:100060004D1C002601210022284602F029FA01C772 +:100070002D1D761C20788642F4D3009800E030468F +:1000800001B0F0BDF0B58FB0012040024A4C00270E +:1000900001902754FF2040000290275203AE3046C3 +:1000A00009F0B6F90546B585A8B2002812D0102887 +:1000B00077D003A887850D9806F026FB02200299C9 +:1000C00060523F486F21017045700121204602F0C7 +:1000D0008BFD58E003A806F017FB0D90208802F076 +:1000E0008AFD2078002802D03448029D2FE0344A4F +:1000F000507813780021354D7D44354E7E446F5C39 +:10010000BB4202D1775CB8420AD0491C0D29F6D314 +:100110006D200002CBB20D210D2B029D01D116E006 +:10012000029D2C487844405C002809D07F20830041 +:10013000672000021279002A09D0E25A052A06D067 +:10014000880025497944085806F024F880471D495D +:1001500060529321C900615C00290CD0019BE15CD5 +:10016000EF220A40E25409210903884203D05D21AD +:10017000154A01235354615B020A114B5A545A1811 +:100180005070881C605306F0B3FA03A9884202D16C +:100190000D9806F0B9FA03A8808D002809D10FB098 +:1001A000F0BD03A887850D9806F0AEFA102004F084 +:1001B000C1FF04F0BFFFC0467C180020AA6F0000FA +:1001C000E01F00200202000000180020E995000056 +:1001D000F2950000D7950000C4950000F0B583B0FB +:1001E00019480026FF243146224604F084FF0120EE +:1001F00001904002154D02902E5464002E535D264E +:100200001348815D0298285C9322D700EA5D002A9A +:1002100006D0002904D020210843019949026854DE +:10022000295B05F0FDFA7F2189006852E85D00280E +:1002300006D00748805D002802D0002006F024FA8E +:10024000FFF720FFDBE7C046E01F00207C180020FE +:1002500000180020F0B581B0304C7C44204605F0F9 +:1002600099FF808802F0C7FC204605F093FF808844 +:10027000C0B2264CFF2845D02948784405F08AFFB3 +:100280008088FF2108423DD0214804680546A088A7 +:10029000204F7870000A3870E088F870000AB87053 +:1002A000207A387109342046009109F017F9024686 +:1002B0007A71B81D214604F008FF2C6820460930E9 +:1002C00009F00CF90546AE1D2734204609F006F961 +:1002D000F1B27854EE1DF0B23D18204609F0FEF858 +:1002E00002462846214604F0F0FE094800682730FF +:1002F00009F0F4F88019C0B200994900064A50523A +:1003000009200403204601B0F0BDC0468569000005 +:10031000181D0020E01F00207C180020A2A800006B +:1003200082A8000010B51148784405F033FF8079A9 +:10033000FF2149000B4A082353520B4930224A70CF +:1003400001228A700523CB7003230B714A710024AC +:100350008C71CB7110401B2242400A7009200003AF +:1003600010BDC0467C180020E01F0020D4A700006C +:1003700070B5194C7C44204605F00CFF808802F0D3 +:100380003AFC204605F006FF8088C0B20F4CFF28DB +:1003900019D01248784405F0FDFE8088FF252842D8 +:1003A00011D06B2004020A4EB07800280BD10C4803 +:1003B000784405F0EFFE80886900064A0123535215 +:1003C000307009200403204670BDC04685690000D6 +:1003D000E01F00207C18002088A7000068A700000C +:1003E0004CA7000010B50720C0430A49097900292D +:1003F00000D00846C4B267200002F82C09D805488E +:10040000214606F035F8FF20400003490C52092030 +:10041000000310BDE01F00207C180020F0B585B05F +:10042000524E3779554D7D44284605F0B3FE8088FD +:1004300002F0E1FB284605F0ADFE8088C0B24C4CCE +:10044000042800D98CE0012529468140162001426C +:1004500000D185E00497B1786B2007020020802945 +:100460001CD000297FD1701D00262946324602F09B +:1004700027F83F21C9003F4A50507D208000165484 +:10048000280215543D20C00016543B4816547B20CA +:10049000800016541675D677344E0420F178002962 +:1004A00061D10499091AFF252A46EE32314FB95419 +:1004B0003018401D1F2109017850012002F060FC16 +:1004C00009200203387D08284CD1049535460026C2 +:1004D0003E757D2080003946385CFB340028274675 +:1004E00041D0202468462F463037076044600846D4 +:1004F0002830012103923246334605F0C7FF082118 +:100500000291284605F0B4FF322028706E702A1D33 +:10051000384621462346264605F0E4FF3F20C0002A +:10052000144C21582846243002F07BF92846283004 +:1005300021461531029A04F0C8FD1148784405F0AF +:1005400029FE69460F604E600830302331462A4646 +:1005500005F0D8FF0498400038212152039F02E0A3 +:10056000274600E01746B8B205B0F0BDE01F0020F6 +:10057000856900007C18002086040000D6A60000D3 +:10058000C0A50000F0B59FB014460E4602AD694606 +:100590000D60012115AF1A463B4602F0C2F908353D +:1005A0004127002E03D1284601F090FD212741224A +:1005B0002046294604F089FD38461FB0F0BD0000F2 +:1005C000F0B59DB0C44E7E44304605F0E3FD85791C +:1005D000BC4CA0780D90304605F0DCFD2927C05DAD +:1005E000012635400B95002500282A460AD0A07820 +:1005F00002282A4606D1B448817901220020072921 +:1006000000D002460C92B548784405F0C3FDC05DA9 +:100610000D9B012B29460DD00C990029294609D1A3 +:100620000028294606D0A84881790020072900D053 +:10063000064631460A910127012B384600D128464B +:100640009321C900A14A515CA14EFE36E2780029EF +:1006500003D0002801D1354630E16B200502A07897 +:10066000022800D92AE1022A11D3032A08D0022A3B +:1006700000D023E197480068406B002807D11DE1B6 +:10068000944800684021405C022800D016E16720B1 +:1006900005022079002800D110E1012B099202D136 +:1006A000601D04F073FB08900C98002809D0607955 +:1006B0008000801DC0B220180121002201F000FF3F +:1006C0001C90874D7D44284605F064FD808802F02B +:1006D00092FA284605F05EFD7D49CD1C8088C0B2A7 +:1006E000042800D9EAE00121079181401620014247 +:1006F00000D1E3E005F08CFFAA28754D00D0DDE0C5 +:10070000651D2846394602F0A5F906904120207063 +:10071000671C14AB28460B993A46FFF733FF099B39 +:100720000546012B14D0032B10D1E9B20EAD38468B +:100730002A4602F07EF800206946086022464332CD +:1007400014213223284603F043F843E0022B34D12E +:100750000EA8142104914170002105910170E9B2A5 +:10076000821C38461F46039202F063F8594800681D +:10077000022F17D1049F406B00282CD005F00AFDF2 +:100780000146684607602746433700223846039BE8 +:1007900005F0C8FD0546E8B201281CD1384608F02E +:1007A0009DFE17E0C08869460860059848602246AB +:1007B00043320EA8162196230AE046480068808836 +:1007C00000216A4603C2E9B22246433296233846E4 +:1007D00002F05EF80546422025540B98002801D10E +:1007E00004206070EFB2E5192846433014A9202296 +:1007F00004F06BFCFF20400039466331334B195243 +:100800000D98012830D0069800282DD00C9800288B +:1008100047D02425585D002808D0194620311CA84F +:10082000042204F071FC294B00283AD000265E55C2 +:10083000184620301CA904221F4604F046FC1C9BCD +:100840002046C8300925274A7A44294605F0CEFAC1 +:10085000D020265407984002395C10220A433A54AB +:1008600004F0C0FA2D0329E00D95322F354625D826 +:100870002046C830433421463A461C4604F025FC45 +:10088000C82000210D9A115407984002215C1022C3 +:100890000A4322540898C0B204F086FA09200503DE +:1008A0000CE0092005030A98002807D007984002A9 +:1008B000195C10220A431A5404F09EFAA8B21DB023 +:1008C000F0BDC046E01F0020342100207C1800202D +:1008D00082690000181D002036A50000F4A4000065 +:1008E00038A40000E08D0000B0B569230021852206 +:1008F000002808D0FF2040000C49085A0C49411834 +:100900000B32002001E010461A468BB2094CE2542B +:10091000FF2252008B1C054DAB52491C89B260541A +:1009200099B2202004F07CFFB0BDC0467C180020A6 +:10093000FEFF0000E01F0020B0B50848084D01216F +:100940002954084800242C52074828180822214618 +:1009500004F0D1FB05482C54B0BDC0467C04000017 +:100960007C1800206E0400007D0400008504000057 +:10097000F0B595B08F20C500BB4F00267E51BB4C13 +:10098000385D022822D0012800D069E1C14D7E5196 +:10099000B748395A002900D14AE1B848385C0122E9 +:1009A000FD281FD27851022139554721090178507D +:1009B000B24838188118AE4C15463A5B521B04F009 +:1009C00084FB385B401B3853012631E1A84C395B6E +:1009D000092900D22CE1A74BF85CFD22FC2812D893 +:1009E00009221FE0FE282FD0FD2800D038E103297E +:1009F00000D21DE1A848395C9F208000385C0002CD +:100A000008430322CEE7904200D029E10B2900D20F +:100A10000EE19948381800210A4601F02DFD954B4A +:100A2000395B0B221018884200D901E103950B9025 +:100A30000020012691493A18525C401C002A0ED130 +:100A400000240728F7D918E0052900D2F0E09248E1 +:100A5000381800210A4601F033FD0522A2E7791873 +:100A600013AC0822204601F052FF85483818014691 +:100A7000224602F0C9F87F4B3446FD18284601F0A3 +:100A800009FE0790284601F019FC05900A952846B2 +:100A900001F04CFC02907B4800684023C05C0022BF +:100AA0001128114609920492089230D17B208100CE +:100AB00006910A9D2846019301F00EFE08902846F3 +:100AC000069901F041FE09902846069901F041FE81 +:100AD000019B01466B480068C05C112817D1099D35 +:100AE00006910A9801F09CFB05990843002802D062 +:100AF0000699019B0BE0284608990843002C01D178 +:100B00000799084300280699019B00D1A8E05D4899 +:100B10000068C05C11280B9A06911DD01D4601206B +:100B20000021079A002A00D0084604430A9801F0E1 +:100B300077FB05990843012C069B02D1002800D1C0 +:100B40008EE050480068415D0124002011290B9A75 +:100B500000D1044604941946089D09980543002DC8 +:100B60000A981CD000291AD00B460499002919466E +:100B700015D100210C9112917B218C000CAA12AB93 +:100B8000214601F021FE395D1298002901D100288B +:100B900066D0002901D0002862D10B9A06990798E7 +:100BA00000283DD13848385C002839D00B46059CD8 +:100BB0000299214304250320002900D00546234340 +:100BC000002B0BD131483918E8B23818294A80185F +:100BD000142204F099FA0B9A002833D03D20C0006B +:100BE000002C1DD0385C00281AD00CAC14220A92BC +:100BF00062700020207025483918A01C04F065FAA6 +:100C000016212046224601F014FEE8B23818194990 +:100C1000401821460A9A04F077FA00280BD00B9A64 +:100C200003983A5001204002395C10220A433A549A +:100C3000304615B0F0BD134800684421405C4007C1 +:100C40000ED50B9A1248395C002909D1012139547B +:100C5000472000013958491E3950002AE8D0A7E63C +:100C6000012004F067FAC0467C1800207C040000D4 +:100C70006E04000082020000830200007A0200007D +:100C80007D040000181D00207602000062020000B2 +:100C900085040000740400007B02000070B59EB063 +:100CA0000C4601AD69460D600126002214AB3146A9 +:100CB00001F037FE0948784405F06CFA083581796F +:100CC0004120314203D1284601F000FA212081B2AF +:100CD0002846224601F0ADFD1EB070BD469E0000C4 +:100CE000F0B59FB0E04A94786B210E021179002C88 +:100CF00004D0FF2C02D0802C00D09CE10A90DB4B6A +:100D0000DB4F3D20C0000990385C0025002806918B +:100D100012D0F85C00280FD150790125FD21FD2863 +:100D20000AD34A1CD5B205220023A84200D01A4695 +:100D30000325884200D015460BAE304608F068FB0C +:100D4000B085CC49084208D00BA8002181851598B0 +:100D500005F0DAFC6F20060249E10BA805F0D4FC8F +:100D60001590387DC44E092800D03DE10221C843CA +:100D7000801CC0B284423FD1787F002800D11FE19F +:100D80004F20C400385D002800D12DE100255822F5 +:100D90000A98294604F0AFF9B3494879002800D1F0 +:100DA0000EE10A9E2336491D2922304604F08DF9B2 +:100DB000B74839183046FFF771FF3D55B248012555 +:100DC0003D5434463046AC4E294601F0F1FD002832 +:100DD00000D1F5E09320C000385C002800D003E18A +:100DE000A848042139546802395C10220A433A5455 +:100DF000204604F00BF8E3E00791F520400008904E +:100E0000385C002813D1E8B206990B1A3446FB3639 +:100E1000002B00DAE8E000216A4611605160924A36 +:100E20001018421D3846283005F030FB2646787FE2 +:100E300000282FD0914C385B069D4119FB367D224E +:100E40009200914200D9CFE038188D494018864968 +:100E5000491D2A4604F039F9385B40193853FFF729 +:100E600087FD002804D001204002385CC006F6D57A +:100E700047200001385800287F4E0BD10120410245 +:100E8000795C1022114205D17E4B0324FC5411439E +:100E9000400239540998385C734A9178002925D06A +:100EA00000280A9C11D120206946486017A80860D4 +:100EB000384694306C494A1D0121069B05F0E6FA3C +:100EC00069490998385C002853D00898385C002894 +:100ED00023D020206946486017A808601720000129 +:100EE0003A1838469430012160233FE000280BD1A6 +:100EF0000021684601604160384694305A4A521DCC +:100F0000069B05F0C3FA584A012058497854FF213E +:100F1000490078520020107052E020220392684667 +:100F20001B2109017C18046042603D4628350121DF +:100F30000491002305932846224605F0A7FA284687 +:100F400005F0C4FA684622460260039B43602846C7 +:100F50000A9C04991D4605F099FA6846456017A950 +:100F6000016038469430404A0499059B05F08EFA9A +:100F70003D49787F002829D04348385C002804D1B7 +:100F800000215822204604F0B6F840480068017954 +:100F900061708079A07020464C30082105F068FA15 +:100FA000FF2040000799395200202F4908704870EF +:100FB000787F002811D0E01C17A9202204F085F8C2 +:100FC000159805F0A1FB0920060334E0FF2040003E +:100FD000079A3A52002048700870E11C17A8202296 +:100FE00001F010FC002829D0159805F08DFBFF209A +:100FF0004400002038533875204D7A5B204839185A +:10100000194804F062F8785B385305F071FB0BA9BE +:10101000884202D1159805F077FB1A48012139540E +:10102000164800243C521B4838180822214604F078 +:1010300062F819483C54B0B21FB0F0BD0898385C53 +:101040007B218900795C014309983A5C0A20002AD7 +:1010500005D0090603D1012008997854002038757D +:1010600009200603D1E7C046E01F002079020000F6 +:101070007C180020FFFF0000856900006E0400005E +:101080007A0200007C04000076020000181D002097 +:10109000620200007D0400008504000070B541205C +:1010A000C000134D2818FFF71BFE0446012046021E +:1010B000A85DC0061AD50F48295C042904D003296D +:1010C00005D103F031FE04E0012129540EE003F0C4 +:1010D000FFFD00280AD1FF20400000212952A85D11 +:1010E000EF220240AA552975D520C401204670BDC3 +:1010F0007C1800207C040000F0B581B009210D03AC +:10110000002800954BD0472007014B4EF0594B4B20 +:10111000F15C022901D1401EF051002828462AD056 +:10112000474830188F21CC0032598118454D735BE8 +:101130009A1A03F0CAFF3059715B081A70530124E0 +:101140006502705DEF2101407155FFF711FC002829 +:1011500002D0705DC006F8D5705DC006009D2846BF +:10116000364B08D503F0B4FD002862D1002030755D +:101170003548FB30314BF15C022917D1F259002A76 +:1011800014D103201F46F05403F0CEFD01240028A3 +:101190004FD10022F2552C48FB3011461DE0264865 +:1011A000002202752549415C27481CE0032915D11E +:1011B00000217177F5214B00F15C7B229200B45C39 +:1011C0000C433D21C900755C03210A22002D04D087 +:1011D000240602D10122F25400223275FF2252006D +:1011E000B25A1A4BD21893B2040A194DEC54FF2686 +:1011F0007400931C104F3B53521C92B2A854009A97 +:10120000904201D103290FD10C48012139540D48D6 +:1012100000243C520F4838180822214603F06BFF87 +:101220000D483C5470003B5A99B2202004F0F8FA63 +:101230000024204601B0F0BD7C1800207C04000092 +:101240007A0200006E04000085690000FEFF0000C5 +:10125000E01F00207D04000085040000F0B585B08B +:10126000704D2F79784C7C44204604F093FF8088A1 +:1012700001F0C1FC204604F08DFF6B4EF21C80880B +:10128000C0B2042800D9C9E004970127394681403B +:101290001620014200D1C1E0A878644A7632802845 +:1012A00008D0002800D0B9E03902614B03245C5417 +:1012B00000211975EC788023052C55D8012C53D0CA +:1012C00000286DD1581CC1B200208C4200D00746C6 +:1012D000A01E02905648407F002803930CD1184668 +:1012E0002A30C0B20090019105F092F90199009A5C +:1012F0009042324600D091E07B2080004C4A134659 +:101300001F54012000228C4201461F4600D0114686 +:10131000029BDBB2042B034600D3134619433D2343 +:10132000DB00F9547877FA83424909684023CB5CA3 +:1013300041497A540326744002265E402643002E1B +:1013400000D01046FF263246EA32B8541A2B12D883 +:1013500001209840394A10420DD0E878052808D07D +:10136000042808D1012005E0802C19D0812CA7D0B9 +:1013700054E002207854324800243C54F5204000C8 +:101380003C54304838181822214603F0B4FEEC369D +:10139000BC554F20C00001213954EC78A878039B3C +:1013A000FF273946EC31224E3D22D2009C4229D003 +:1013B000B25C002A26D0725C002A23D1984221D147 +:1013C00028790A38C0B231281CD86879022819D87F +:1013D000012808D1A879382805D1E879322802D126 +:1013E000287A00280ED09320C000305C00280F4AD5 +:1013F00014D1012070544002315C10220A4332544F +:1014000003F024FDEE370498F0551F200001691DFC +:101410003150022001F0B4FC0920020390B205B063 +:10142000F0BDC046E01F0020826900008A6A00000B +:101430007C180020181D0020860400008001400454 +:10144000870400006202000096980000F0B593B097 +:101450006F4C7C44204604F09DFE808801F0CBFB5D +:10146000204604F097FE8088C0B2604F04283ED822 +:101470000124214681401620014238D05C4E6B2069 +:101480000002B178002902D0F178002930D167201C +:101490000002317907292BD305AD284607F0B8FFA4 +:1014A000A8855449084208D005A8002181850F98D5 +:1014B00005F02AF96F2007020EE005A805F024F9CF +:1014C0000F904D49087D0A2803D1FB3770790B280E +:1014D00011D30F9805F018F947480021017505F060 +:1014E00007F905A9884202D10F9805F00DF9384691 +:1014F00080B213B0F0BD41480818751D2922049030 +:10150000294603F0E2FD707980002043295C281809 +:101510004518681C00222146039200F0D1FF02907A +:101520006E79354D36482E543A48784404F032FEF0 +:101530008079042108420DD1324800684021415C85 +:10154000022902D0816B00294BD0412EC1D1806B82 +:10155000000206432C48285C00281CD111AF3846F5 +:10156000029901F05EF9381D314601F05AF97B20ED +:101570008000285C002804D011A8082100F02EFE6D +:1015800009E068460399016041602846283011AAA5 +:10159000082304F07BFF0021049E304601F05AFA34 +:1015A000002804D00120014600F036F807E0600270 +:1015B000295C10220A432A54304603F037FC93205A +:1015C000C000285C09210F03002888D00F488168DB +:1015D000491C81604268914281DB5D2101224254B5 +:1015E0007DE7012E2646B5D073E7C0468569000029 +:1015F000E01F0020FFFF00007C1800202B020000ED +:101600005E020000181D0020860400000018002063 +:10161000AA960000D2950000F0B5B1B0002818D00D +:1016200003910021684601603648374C201827ABEB +:101630000A4601F076F97B208000205C002810D05B +:101640002020694648601FAA0A60412080002018B7 +:101650000EE0FF2043002C4A0020D052692285264C +:101660003CE02020694648601FAA0A6020462830D6 +:101670000121002304F00AFF04AF384604F026FFDE +:101680002025684645601FAE066001243846214685 +:1016900032462B4604F0FAFE1E48784404F07AFDE8 +:1016A0008079400820406946FF273A4652320A6056 +:1016B000486027A8154C31462A46234601F068FAAF +:1016C00079006278D01C104B58521149595CA2180D +:1016D00091707A21CA430B320026039900290ED15A +:1016E00083B20A4CE254FF225200831C064DAB52D7 +:1016F000401C80B2265499B2202004F091F831B0F9 +:10170000F0BDC0462B0200007C180020E01F002026 +:101710005E02000062940000F0B581B0672006020E +:10172000284D287901282AD1284C7C44204604F0F1 +:1017300031FD808801F05FFA204604F02BFD80889F +:10174000C0B2214FFF2819D02148784404F022FD6F +:101750008088FF21084211D0FE1E04F059FFAA28FC +:101760000DD16C791B48784404F014FD092109035C +:101770008088C0B2844205D10E4600E03E46B0B239 +:1017800001B0F0BD3E46FB36082CF8D80091012090 +:10179000A0408B2149000842F1D00F4D7D442846DE +:1017A00004F0F8FC408801F026FA284604F0F2FC28 +:1017B000408820423E46E2D0204600F08FFC009E4A +:1017C000DDE7C046E01F002085690000D2930000DD +:1017D000B293000096930000609300006D20000219 +:1017E00070470000F0B58BB009AD002106262846F1 +:1017F000324603F080FC0A200A9901432971012432 +:101800002846214601F0F0F902202843214601F044 +:10181000EBF9124F7F44384604F0BCFC801C29468B +:10182000324604F017FE6D4620262846314604F065 +:101830001FFE384604F0AEFC08302946324604F05C +:1018400009FE08AD2C70384604F0A4FC401C294663 +:10185000224604F0FFFD0BB0F0BDC046E892000048 +:10186000F0B581B0017800250091002918D0441C02 +:1018700000270125002620462946324600F020FE9A +:1018800080B2094988420BD00849884207D0241DFC +:101890007F1CF8B2009988423546EAD300E0022561 +:1018A000E8B201B0F0BDC0461DB100001EB100009D +:1018B000F0B59BB0B54A9778802038436B210E0273 +:1018C000802800D034E110790C90D578002F04D115 +:1018D000022D02D3802D00D02AE1D520C401264656 +:1018E000FE3EAA200B9004F093FEAA2800D01FE130 +:1018F0000FAE304607F08CFDB085A549084208D0F0 +:101900000FA800218185199804F0FEFE6F200402C3 +:10191000FDE00FA804F0F8FE1990002F16D09721D3 +:1019200089009C4D695A13225201002900D1ECE034 +:10193000AA5A8A4200D0E8E097482818FFF790FF9B +:10194000002864D000F032F90446E8E0012D2AD8DE +:101950004120C0008F4F381800265822314603F02E +:10196000CAFB8A4B58790B2800D3CDE08B4800681E +:1019700001798B4AB95480798A4978548648381855 +:10198000591D292203F0A1FB8048024650798100AD +:101990000120084312185179002D49D0927909028B +:1019A0001143072245E097218F007A4DE95B13220E +:1019B0005601AA5B0C9BD2188A4200D9A5E00024EC +:1019C0006846046044602846283070494A1D0392E6 +:1019D000214604971F4604F059FD684604604460A0 +:1019E000284694302146039A3B4604F04FFD674A4F +:1019F000A85BC019A85314700499695A80B2814237 +:101A000011D1FF204000022129525470BBE0012077 +:101A10004002295C10220A432A54199804F074FEEB +:101A20000920060384E0FF20400001212952AAE09A +:101A3000062297239B00F9528018002964D0089051 +:101A40001320400135460A903D523E46283738461D +:101A5000069304F03BFD30469430079004F036FDC9 +:101A60004E4E3068093007F039FD11300EAA107063 +:101A7000684605604560012338462946099304F00D +:101A800005FD36680936304607F028FD03466846EE +:101A90000560456038462946324604F0F7FC684642 +:101AA00005604560404A7A4411233E46384629463F +:101AB00004F0ECFC06993748405AFC280F4603D83E +:101AC0000DA90870012307E00DA948700B9A533245 +:101AD0000A70000A8870032330463E460590694626 +:101AE0000D604D600DAA294604F0D0FC0C98FB381F +:101AF0000899401A0EA90870264F0A9AB95AC3B21B +:101B00005818B95B884216D9199804F0FDFD412098 +:101B1000C000204908180021582203F0ECFA04F014 +:101B2000E7FD0FA9884202D1199804F0EDFD264681 +:101B3000B0B21BB0F0BD6846056045602C46134E40 +:101B40000899761805982146324604F09FFC0EADA0 +:101B50002B7868460460446007982146324604F0BA +:101B600095FC0A4E0A9AB85A29784018B85234702F +:101B70000699795A80B28142099901D17470022183 +:101B8000FF204000395209200403C8E7E01F00206D +:101B9000FFFF00007C1800202B020000181D002011 +:101BA000090200000A0200002A7C0000F0B5A3B080 +:101BB000FF204600374F0024BC5305AD284607F0F0 +:101BC00027FCA8853449084207D005A884850F98CA +:101BD00004F09AFD6F20040243E005A804F094FD90 +:101BE0000F90202103916846416004961BAE066069 +:101BF000284F28370125384629463246234604F027 +:101C000045FC384604F062FC68460660039B43606E +:101C100038462946324604F039FC684604601F48BD +:101C20001C49081811AF214622463B4600F079FEB8 +:101C30001C48784404F0AEFA807940082840694690 +:101C400064220A604860164C3846124F3146039AA7 +:101C5000234600F09DFF6078801C0499785209208B +:101C6000040304F045FD05A9884202D10F9804F051 +:101C70004BFD4120C00038180021582203F03BFAE8 +:101C800005A8808D002802D1204623B0F0BD03F0C6 +:101C900051FAC0467C180020FFFF00002B02000014 +:101CA000E01F0020CA8E000070B59320C000094DCF +:101CB000285C002801D0084C09E001204602FFF70B +:101CC000F7FD0446A85DC00601D503F053F8204691 +:101CD00070BDC0467C18002082690000B0B5014686 +:101CE00069228520002902D0FFF760FF020AFF2148 +:101CF0004900074B5C5A074D2A55A21C5A52611CD9 +:101D000089B2685491B2202003F08AFDB0BDC0466C +:101D10007C180020E01F00206D20000270470000AA +:101D2000F0B589B01E4617460A460024E543782AD6 +:101D300000D987E0002A06D00024015D002902D1E5 +:101D4000641C9442F9D30490111B8A2048436421F7 +:101D5000069207F0ABF803465A1C306898423FD908 +:101D600001960295002138460092059303F0C3F9CD +:101D7000059B03940698844226D21946039A049838 +:101D80000792805C491E08911C46395D09020E18B5 +:101D90003D463A273046394607F012F94743F11BD2 +:101DA0002F463955393608998C4201D8732E04D301 +:101DB000611E002C0C46E8DC00E02146079A521C0C +:101DC00006988242059BDAD10021039A029D019E6A +:101DD000785C002806D1481C99420146F8D302E0FD +:101DE00032602FE0084600998918091A336831607B +:101DF0008B4227D3131A002B10DB481E0028059BAB +:101E000019DB134878447C181E46BB5DC35C6355E0 +:101E100033465B1E491E0029F5DC0CE08A420AD2DB +:101E20000A49794414463B5CCB5C3B55401C641C1E +:101E300033689C42F7D3074878440178384603F06A +:101E40005AF90025284609B0F0BDC0467478000054 +:101E5000927800005E780000F0B595B000920F46D1 +:101E600002900AAC2A21204607F096F9022004438A +:101E70000594790001400D220A4303924140881DD8 +:101E800001901325002102980491405C06900021E6 +:101E900007200991401A01210891814006980140CC +:101EA0000791ECB2142C0ED81520021B60000AA971 +:101EB0000E183188C81C042900D808463080521EEC +:101EC000B61C002AF5D160000AA9085AFF34072879 +:101ED00000D82C46E0B2132817D814210D1A400060 +:101EE00005990A180AA90E5A138801210027072B01 +:101EF000084600D8384676000E2737400743C843C7 +:101F00001752921C6D1E1E46EED107980028089AA3 +:101F100000D10246149840000E21014011430AA846 +:101F200001850999491C08292546B1D10499491C04 +:101F300008292546A7D100210B460A460C46009EDB +:101F4000D8B240000AAD285A240603D1002801D196 +:101F50000C4604E0D4B230303055521C01245B1CD6 +:101F6000D8B2039D8542EBD81106019D02D13021E4 +:101F70003170012200242146CEB2B5420D4622D94D +:101F8000361876000AAFBE5B6D1C002E04D1EEB28F +:101F9000019FB742F4D816E02506009F04D1D4B2C1 +:101FA0002E253D55521C0124DDB26D000AAE755B35 +:101FB0003035D6B2BD55521C5B1C491CCDB2019EBA +:101FC000AE423546D8D8D0B215B0F0BD80B581212B +:101FD0008900044A525804490968496CFFF73CFFDC +:101FE00080BDC0467C180020181D0020F0B583B0CD +:101FF0002B4D00262B4A2846314603F07CF8284614 +:10200000314600F0F1FD28482E529320C0002E5496 +:10201000264801242C54264828180822314603F06B +:102020006AF8FF20EC302E5422482E54224878447F +:1020300004F0B0F84078012801D0FFF7D3FB1F4827 +:10204000784404F0A7F84078002807D01C4878446A +:1020500004F0A0F8808800F0CEFD02E0FF2000F040 +:102060003DF81848784404F095F80078002814D119 +:1020700002AD2C7001AE3470134F7F44384604F02B +:1020800089F829303146224604F0E4F9384604F054 +:1020900081F82946224604F0DDF903B0F0BDC046C0 +:1020A0007C1800209C0400006E0400007C040000EA +:1020B0007D04000085040000CE8A0000BC8A000078 +:1020C000AE8A0000988A0000828A00004021415CAC +:1020D00001220A40022111430170704710B582B0FD +:1020E000014601AC204600F07FFD0548784404F02D +:1020F00051F8001D0222214604F0ACF902B010BDD7 +:10210000108A0000F0B58DB00746412080003249AA +:102110000D180C46284604F0D9F9002668460660DA +:10212000466077208000221804232846314604F0B8 +:10213000ADF9684606604660172000012218202489 +:1021400028463146234604F0A1F9684606604660F9 +:102150001920000120490A1828463146234604F078 +:1021600095F90C960B96039708377D2084000CAAEE +:102170000BAB3846214600F0C7F9002828D00B9851 +:102180000C9900266A46166056600B1808332846DC +:102190003146039A04F07AF904AA3846214600F041 +:1021A000DDFA002813D068460660466004AA1A23A8 +:1021B0002846314604F06AF96846066046600823FE +:1021C00028463146039A04F061F9012600E0002612 +:1021D00030460DB0F0BDC0467C180020F0B583B08D +:1021E0000C46054600266846066046604120800091 +:1021F0000A490F181B2000010A18202338463146CF +:1022000004F044F9684606604660384631462A467E +:10221000234604F03BF903B0F0BDC0467C18002013 +:1022200070B504461E4E3068416B002911D01D491F +:1022300079440322204602F067FF012500282CD0B4 +:10224000194979440322204602F05EFF002824D079 +:1022500030684021405C13280CD114497944042291 +:10226000204602F051FF002816D118341049794455 +:1022700028220BE00F4979440422204602F044FF53 +:10228000002809D118340C4979440222204602F072 +:102290003BFF0125002800D00025284670BDC04620 +:1022A000181D002031740000227400000B7400001F +:1022B000FD730000B7730000A9730000B0B50446B9 +:1022C000154800684021405C132810D11349794417 +:1022D0000322204602F018FF00281AD117341049B3 +:1022E00079442722204602F00FFF01250FE00D4917 +:1022F00079440322204602F007FF002809D1173451 +:1023000009497944012520462A4602F0FDFE0028AD +:1023100000D000252846B0BD181D002069730000BC +:102320005A7300004373000034730000B0B50446D4 +:102330000C480068406B002810D00B4979440322F8 +:10234000204602F0E1FE0125002808D00749794423 +:102350000322204602F0D8FE002800D0002528469F +:10236000B0BDC046181D0020257300001673000084 +:10237000F0B586B0FF241470046800278C421AD28E +:102380000B9E002B01D000241C60002E01D00024E5 +:10239000346005684C1B012C0DDB05922A46551C48 +:1023A000056014784E2C5FD804954C2C039704D20A +:1023B0002746049D45E03C4659E000274E2C26D098 +:1023C0004D2C0DD04C2CF4D102943746049C0E1B9E +:1023D0000024012E3E464ADB951C056057782FE00D +:1023E00002940196049C0E1B0024022E15463EDB2F +:1023F000009300231C461F46049AD65CE4B2A64014 +:10240000F7195B1C0834022BF7D1ED1C15E0029480 +:102410000196049C0E1B0024042E154627DB009316 +:10242000002423462746049A165DDBB29E40F71926 +:10243000641C0833042CF7D16D1D0560009B019EC0 +:10244000029C491B002915DB04952546B942039CD3 +:102450000DD3002B01D004991960002E2C4600D01A +:1024600037600168C919016005980470012420468D +:1024700006B0F0BD039CFAE7F0B581B000920722E8 +:10248000D34308240029224600D01A46002900D14F +:102490000C4600252946465D7F273740002D3346F0 +:1024A00000D13B46009F002F00D01E46E3B29E4065 +:1024B00071189C186D1C022DEDD1084601B0F0BDBD +:1024C000F0B581B000920722D3430822002900D042 +:1024D0001A461824002900D10C4600252946465DDD +:1024E0007F273740002D334600D13B46009F002F09 +:1024F00000D01E46E3B29E4071189C186D1C042D3E +:10250000EDD1084601B0F0BDF0B5044600201060E2 +:10251000186000291FD02578FD26FC2D01D8012741 +:1025200010E0032917D3B54215D1601C00242646BC +:102530002546075DF6B2B7407D19641C08360327AF +:10254000022CF6D115601F601068C319012000220B +:102550008B4200D91046F0BDF0B585B01446024656 +:102560000020FD26002B029608D0002300291BD056 +:102570001578B54205D201212B4616E00B460146DF +:1025800013E0032910D3B54219460ED1561C00257D +:102590002F462B46715DFFB2B940CB186D1C083732 +:1025A0000321022DF6D100E01946029DAD1C04AEB8 +:1025B000357055180395D2185518002B17D00026E2 +:1025C00037466846066003A804AA29463346FFF743 +:1025D000CFFE00280AD004A80178781CA14200D0C0 +:1025E00038460399A9420746EBD100E0384605B0CA +:1025F000F0BDF0B585B002920027FD22002B08D077 +:10260000002300291BD00478944205D201212346DF +:1026100016E00B46394613E0032910D394421946BD +:102620000ED1441C00252E462B46615DF6B2B1400A +:10263000CB186D1C08360321022DF6D100E0194697 +:10264000921C04AC227042180392C01845180298DC +:102650000128019716DB002B019F13D00B9C0A9ECB +:1026600000276846046003A804AA29463346FFF7FA +:102670007FFE002806D07F1C0298874202DA03986A +:10268000A842EED1012002998F4200D0019805B0F6 +:10269000F0BD000070B501464A78012300246A2A83 +:1026A000184600D020460B4D2D684026AD5D022D0A +:1026B00000D023461843022D0AD16A2A08D00020F0 +:1026C000002A05D18A78012000216A2A00D0084614 +:1026D00070BDC046181D002080B5C12200F002F870 +:1026E00080BD0000F0B581B015460E460746FFF7E5 +:1026F00097FD0024002804D13846FFF7DFFD0028AD +:1027000002D0204601B0F0BD0E4800684021405C78 +:102710007978022807D16A2905D0002907D1B8782D +:102720006A28EED003E06A29EBD00228E9D0012321 +:10273000384631462A46FFF70FFF00240128E0D132 +:102740000446DEE7181D002080B5C222FFF7CAFF4D +:1027500080BD80B5C422FFF7C5FF80BDF0B585B050 +:10276000144600270497039703AA6B465A6004AAED +:102770001A60022201263346FFF73BFF01283D463F +:1027800000D1054604990029304600D1084605408D +:102790000398142800D03E463540002D11D07620F5 +:1027A0006070192020701422E2707720C6433046F2 +:1027B0002130A070201D02F088FC24366676882027 +:1027C0002076284605B0F0BDF0B583B01D4616460C +:1027D0000024002E13D0002D11D06A4616605560DB +:1027E000032201273B46FFF704FF002807D030688B +:1027F000002804D02868002800D107463C4620461F +:1028000003B0F0BD70B50023002A08D00023521E8B +:1028100094B2055D0E5D6E403343002CF7D1D8B203 +:1028200070BD01700A0A42700A0C8270090EC170F4 +:102830007047F0B5A3B0164603AC202522462B46C0 +:1028400003F050FE0BAF384603F034FE1420694607 +:102850000E6048600121384622462B4603F016FEE2 +:1028600023B0F0BD70B588B014466D4620262A46C8 +:10287000334603F037FE284631462A46334603F0F6 +:1028800031FE04222046294602F01FFC08B070BD2C +:10289000F0B58BB01D4614460346109E022701205A +:1028A000FF2E00D807461198002808D0142038437E +:1028B000C2B202A8194602F008FCFFB20EE0FFB255 +:1028C00002A8C2191846FFF7B4FF300A04D002A8C4 +:1028D0004670310A017001E002A8067014213943E4 +:1028E00002AEF21914323046FFF7BCFF01951821F1 +:1028F000394301AB30462246FFF712FA002803DBCA +:1029000001A800880BB0F0BD012002F013FC002AE2 +:1029100006D0491E8B5C0370521E401C002AF9D160 +:102920007047F0B58DB0174606780B2E3CD201915A +:102930000293002E13D0401C0021182200252B46A4 +:10294000445DD2B29440E3186D1C083A042DF7D1CF +:102950008A0003ACA350491C001DB142EDD103F025 +:10296000FFF868460760212703AD384629463246FE +:102970002B4603F02FFE202238462946029C234690 +:1029800003F0D4FD0198002805D0129921200123DD +:10299000224603F0DBFD03F0E3F803A80021202228 +:1029A00002F0A9FB0DB0F0BD022002F0C3FB000055 +:1029B000F0B58DB0024610780B2843D201260028CE +:1029C0003DD002960191521C0024182500273E4656 +:1029D000D35DEDB2AB409E197F1C083D042FF7D1AB +:1029E000A30003ADEE50641C121D8442EDD10528F6 +:1029F000029E24D10126F207039B53402C2B03D0C7 +:102A0000542B01D0312B1AD110490B681C88002C93 +:102A100006D0049D5540A54202D059888D420ED162 +:102A20006432059991420ADC06990198814206D1E7 +:102A3000074A079B01260021934200D80E463046E4 +:102A40000DB0F0BD022002F075FBC046181D00203D +:102A500050C30000F0B58DB002461F4803681C88C3 +:102A60000120002C33D01078022801D208462EE035 +:102A7000019102930B282CD2521C00251826002706 +:102A80003B46D15DF6B2B140CB187F1C083E042F07 +:102A9000F7D1A90003AE73506D1C121D8542EDD114 +:102AA0000122D307039858402C280299019D04D095 +:102AB000542802D03128284609D1049D5D40A54202 +:102AC000104604D04A88012000219542CED10DB095 +:102AD000F0BD022002F02EFB181D0020F0B585B0DD +:102AE00004920C4602780B2A4CD22021217001213D +:102AF000002A3DD00499891E0191461C0023012122 +:102B000002920393182000221546B35CC0B28340A2 +:102B10005D19521C0838042AF7D1C9B26018049A0A +:102B2000511A0122D2072B469343184A7A4403F0E4 +:102B30005DF927462046049906F068FDC1B2361DAE +:102B4000019A91421BDA002D039B01DB3C4603E016 +:102B500027223C466254401CC1B22F226254411CC1 +:102B6000C8B2002222545B1CD8B2029A9042C8D349 +:102B7000C8B2401E00212154C0B205B0F0BD0320F0 +:102B800002F0D8FA022002F0D5FAC046676B0000C6 +:102B9000F0B587B01C4617460591064602F0E0FFE7 +:102BA0000020069006AD6846C5600C9981604460BF +:102BB00007600D98002801D00A4900E00849032267 +:102BC0003046059B03F0D2FC2878C00703D020785C +:102BD00001210143217002F0C3FF07B0F0BDC046E0 +:102BE00001040000010600000A020A43FF21090255 +:102BF00051400180704780B5FF218143000A814226 +:102C000001D003F01DFC80BDF0B5002307241E4653 +:102C1000155D0F5DF619751905550126FF2D00D8B4 +:102C20001E46671E002C3C46F2D101200021FF2DDC +:102C300000D80846F0BDF0B581B000260724009604 +:102C4000155D0F5D330604D0AF4204D97F1E00230B +:102C500003E0009B01E0FF373346BFB27E1B065501 +:102C60000126AF4200D31E46631E002C1C46E7D14E +:102C7000F0B201B0F0BD000070B582B0044601268C +:102C80003002114D285C30420DD01F2000012A581F +:102C9000002168460160416028462830234603F041 +:102CA000F5FB3002285C80070BD51F2000012A5855 +:102CB000002168460160416094352846234603F0B0 +:102CC000E5FB02B070BDC0467C180020F0B581B0B5 +:102CD000FF26EE36294DA85D002848D01F200701A9 +:102CE000E8590478FC2C05D801252846FFF7C4FFD5 +:102CF000FF2031E0FE2C19D0FD2C3BD10120FFF745 +:102D0000BBFFE859411CE951A95DFF31A955C9B282 +:102D100001292CD941780091847802252846FFF7B3 +:102D2000ABFF240200980443FE2015E00120FFF7CA +:102D3000A3FFE859401CE851A95DFF31A955C9B26C +:102D4000032914D900210A46FFF7BAFB04460425DB +:102D50002846FFF791FFFC2008490A46D159491936 +:102D6000D151915D40189055204601B0F0BD012031 +:102D700002F0E0F9022002F0DDF9C0467C180020E4 +:102D8000F0B5BFB00646EA48784403F003FA857907 +:102D900033AC204606F03CFBA085ED0801273D4002 +:102DA00084B2002C01D000F067FC33A803F0ACFC27 +:102DB0003D90002D199700D119951B951DA8C01D98 +:102DC000189025A8011D169128301790F2481C96DE +:102DD0001A9707466CE2072800D069E23C69002C8C +:102DE00000D163E2FF25EE35785D002801D100F0C7 +:102DF00032FC844200D30446002CE74F01D100F09E +:102E00002AFCE0B2FFF738FF1F20000139580919EA +:102E10003950785D001B78553869001B386147E2EE +:102E20004E783446083CE1B2302901D900F021FC4B +:102E3000B11C1191C9B2884201D200F01AFCD748E6 +:102E4000784403F0A7F9D449149D49596A4656605D +:102E500025AB059313608A1C08302021234603F01C +:102E600051FBCD4840598019811F08220598FFF772 +:102E7000C9FC002800D0FCE3C74D149EA8593D2191 +:102E8000C9006A5C002A0DD03A22825C3223C25407 +:102E9000A859401DA851EA5DF332EA55695C012248 +:102EA00000293DD1811C25AE3046224602F00DF9A5 +:102EB0003078322800D0DCE3B7480546149EAC5980 +:102EC0001698A8512420FFF7D7FE11996018A85131 +:102ED000E85D401AE8552F461DA808221799FFF70C +:102EE00016FD002001460246189E735C7C18257F63 +:102EF0005219D31823770122FF2B00D80246491E0E +:102F00000C460834F1D10125FF2B00D885E0B0E351 +:102F10003D20C000A049085C0022002800D1A8E3A1 +:102F2000139201263046FFF7A7FE9B4D149968586F +:102F3000421C6A50E85DFF30E855C0B2232800D833 +:102F400097E3F5204000285C002826D034022E5557 +:102F50002420FFF791FE00200C942855149C295939 +:102F600024312951E85DDC30E855C0B2072800D88B +:102F70007FE30F20400128180822039202F0A5F8F1 +:102F80000398FFF779FE0C982E54285908302851E1 +:102F9000E85DF830E855139D3FE000216846016088 +:102FA00041601720000128182424234603F06EFAFC +:102FB0002046FFF761FE1498295824312950E85D16 +:102FC000DC30E855C0B2072800D852E31DA808221B +:102FD000FFF79DFC002001460246189B5B5C6E4C8F +:102FE0006418257F5219D3182377FF2B324600D857 +:102FF0000246491E0C460834EFD1FF2B139D00D921 +:1030000037E30820FFF738FE63480146149A8858D2 +:1030100008308850C85DF830C8553D20C0005E4A71 +:10302000105C002802D10120010250541C9E159C06 +:10303000FFF74CFE584F3861022171403D22D2000B +:10304000BB5C2B430B430022002B214600D01146D2 +:1030500000281A9A00D104460C4054401B980028BE +:1030600002D1002C00D104E302203875FF252C4644 +:10307000EE34385D002800D1EDE2396901291A9B50 +:1030800020D11F200601B859007801210022AE2866 +:1030900000D11146199A1143012906D101210022BC +:1030A000AE2800D111465940F9770120FFF7E4FD21 +:1030B000B859401CB851385DFF3038553969491E40 +:1030C00039611C9E002917D04D1EC0B2854200D325 +:1030D0000546002D304F00D1BDE2E8B2FFF7CCFD30 +:1030E0001F200001395849193950385D401B3855A7 +:1030F0003869401B3861DBE0022E1FD13D21C90039 +:10310000795C002916D0F5214900795C002915D099 +:1031100000216846016041600F2040013A1838469E +:103120002830082303F0B2F9EE35785D06E0C0469A +:10313000747D00000121090203227A54C0B20328E1 +:1031400000D896E2F52040003D21C900795C0029B5 +:103150000ED0385C00280BD11F2000013A58002106 +:1031600068460160416038462830042303F08EF938 +:103170000420FFF781FD1F2000013958091D395037 +:10318000385DFC30385501203875B868401EB8608D +:10319000F868401CF8608BE07C180020BC7C0000C4 +:1031A000F5204200B95C3D25E800385C00284FD08E +:1031B00000294DD120266846466025A90991016065 +:1031C000172000013C180B9401210491002308935F +:1031D00020460F92099F3A460E9503F057F9204674 +:1031E00003F074F96846076046602046049D29464E +:1031F0003A46334603F04AF9684646601DAF076019 +:10320000ED4C2834204629463A46089B03F03EF907 +:10321000204603F05BF96846076046602046294671 +:103220003A46334603F032F90B980999324601F0D9 +:103230004CFF19200001E04908183946DE4F32469C +:103240001C9E01F042FF0F98395C0E98C000385C5C +:10325000002822D0002920D0D848385C00280BD183 +:1032600000216846016041601B2000013A18384681 +:103270002830202303F00AF90A20387518E00528C1 +:1032800016D1FF24EE34385D002800D1E3E13D691A +:10329000002D00D01AE7042076E7092139750028AF +:1032A00006D03846283003F011F901E008203875BF +:1032B000397D00E03975C8B2042807DC02286EDDCC +:1032C00003282AD00428F3D1B86836E0062800DDA8 +:1032D000BBE1D4D1FF242546EE35785D002800D12E +:1032E000B9E1032800D8C4E10420FFF7C5FC1F2082 +:1032F0000001E74F3958091D3950785DFC30785589 +:1033000008212042D6D00124250200207855FFF75D +:10331000DDFC7C5538610721CCE7022E00D13FE768 +:10332000FF20EE30385C002800D194E1FFF7CEFC9E +:103330000021B860F9600421397506210028B9D050 +:10334000FF24EE34385D002800D184E1072800D83E +:103350008FE1012ECE4F11D13F20C0003858F968BF +:1033600081420BD11F200001395838461530082200 +:1033700001F0ABFE7D208000012139540820FFF7C9 +:103380007BFC1F200001395808313950385DF83076 +:103390003855FFF79BFC38610520387571E7002828 +:1033A00006D0012802D0022882D15FE6B868E0E0AA +:1033B0000026BE60FE603E61384615300822314668 +:1033C00001F099FE3D462835284603F07FF83C463B +:1033D0009434204603F07AF83D20C000385C002881 +:1033E0003AD0012000023E54F5204000385C00280D +:1033F0002DD0684606604660772080003A18042386 +:103400002846314603F042F86846066046601720B9 +:1034100000013A1807922020069028463146069B64 +:1034200003F034F8684606604660192000013A1837 +:1034300028463146069B03F029F868460660466038 +:10344000602320463146079A03F020F804E0172055 +:103450000001381803F03AF8FF261096EE36B85DF2 +:10346000032800D805E11F20050179597720800045 +:103470001290381804240A90224601F026FE2046B5 +:10348000FFF7FAFB7859001D0D957851B85DFC30B7 +:10349000B8558049795C002917D0C0B2032800D8FC +:1034A000E7E07B4F0D9D79599120C0003818042426 +:1034B000224601F00AFE2046FFF7DEFB7859001D88 +:1034C0007851B85DFC30B8551FE073480068402162 +:1034D000405C16280A9C18D8012181406F4801429F +:1034E00013D0002120460A46FEF7EAFF00280CDA36 +:1034F000002120460A46FEF7E3FF6949884204DBC3 +:103500001099EE316248405CC7E763480068442187 +:10351000415C890718D5007A022806D0042813D107 +:103520005B481299405C01280ED8594CA05D0328D5 +:1035300000D89EE00420FFF79FFB0D996058001D06 +:103540006050A05DFC30A055FFF7C0FB504FB86045 +:103550009321C9001C9E022E524A08D1795C002991 +:1035600005D05168002900D150600021116001216F +:10357000397500281DD03846FF27EE37C05D00287A +:1035800069D00124022E1BD0012E254600D04FE524 +:1035900023286ED92420FFF76FFB1F2000013C4930 +:1035A0000A46115824311150D05DDC30D055012528 +:1035B0003EE5032038757BE67C1800208604000079 +:1035C000012856D91F210A011492314989580A78D5 +:1035D000022A159400D19BE4012A00D120E4002A9C +:1035E00047D13D20C0002A49085C002841D12E4C1B +:1035F0007C44204602F0CEFD8088FFF7FCFA20468E +:1036000002F0C8FD8088C0B2042806D0022804D089 +:1036100001282ED11B9800282BD01D4C149D6059D9 +:10362000401C6051E05D401EE055C0B2232820D907 +:103630002420FFF721FB605924306051E05DDC302D +:10364000E0550120A0770025E7E401460839032969 +:1036500001D3FFF7C0FB03F04BF833A9884202D136 +:103660003D9803F051F833A8808D00280DD13FB06C +:10367000F0BD012001F05EFD33A8002585853D9851 +:1036800003F042F802480575204601F053FDC0469C +:103690007C18002086040000181D002080014000D6 +:1036A00003000080001800200C750000F0B581B008 +:1036B00000900B09012213405B42194C1C40CD08BD +:1036C00015406D42174E2E404701774067404C0928 +:1036D000144064421448204078408E0916407642D7 +:1036E000124F37404740C80910404042104A02403C +:1036F0007A4098272F40009DED0E49012943C9B219 +:10370000794079251D404D40F32121406940AE2389 +:1037100033404B401E2101405940104601B0F0BDDE +:10372000E2996DB7618EBCF2C4B35F3EA8E2AB2EE6 +:1037300070E4434FF0B581B015460E4607463C781D +:10374000012000210090FFF7B1FF002C12D07F1C58 +:103750001F22224042403C781046FFF7A7FF7F1C03 +:10376000002CF5D106E0FFF7A1FF0246307850406B +:103770006D1E761C002DF6D10824FFF797FF641EFE +:10378000FBD1009A504001B0F0BD000070B5144666 +:103790000A4601460D487844FFF7CCFF2322054630 +:1037A000D54020239E1A0B46B3402B431646203E9D +:1037B0000D46F540002E00DA1D461F232B402370D6 +:1037C000531F641C002A1A46E9D170BDA65F000091 +:1037D000F0B599B01D460346002017901690107062 +:1037E00014296FD11E990020002904D0012969D124 +:1037F0000192082000E001920CAF3870781C14226E +:10380000194601F062FC15210026324630463B780D +:1038100000021843134608337F1C491E0224E44368 +:10382000A2420EDB0D3213460A3B0446DC401F2346 +:10383000234002ACA355521F761C092AF3DC521F09 +:1038400000E01A460029E2D1002A019F07D0052195 +:10385000891A88401F21014002A88155761C02A8C0 +:1038600016AA3146FFF792FF0020002E394611D0EC +:1038700002A801780023144A7A44202920D2581C37 +:10388000AB421DD202ACE45C145DFC54B042034672 +:10389000F3D3391800220D4B7B4416AC2478202C2E +:1038A0000ED28418641CAC420AD816ACA45C1C5D11 +:1038B0008C54521C082AF0D300238B54801801E04A +:1038C0000020387019B0F0BDD05E0000B05E00007E +:1038D000F0B58BB00AAC55202070099401206946E0 +:1038E000886009A8486000250D607B487844402125 +:1038F0009F232A4601F042FC002800D1E3E0207813 +:10390000012800D0DFE005F0FFF9284605F070FA45 +:10391000C4266E4F0323BB55C022704979440892D8 +:10392000B9502C46D0206E49794403903950CC21AF +:1039300007917C5066480370446002F075FE0425D0 +:10394000284602F0EDFE6249486001F073FE01F086 +:1039500073FEBE2005903C52284602F0E1FE5C4911 +:103960004860002837D0972835D008983858002864 +:1039700031D00598385AAA24B95D80B288422AD23B +:1039800002F09AFE002826D102F018FEA04203D1D0 +:1039900002F03EFEA0421ED1089838580599795A87 +:1039A0004901401807997958002902D08847002812 +:1039B00009D0012805D1089838580599795A490144 +:1039C000401800F011FB0599785A401C785208996C +:1039D00079580029D0D1BC5D05983D5A4B20810013 +:1039E0003C480022049102F073FE01F0BFFDA542A5 +:1039F00043D2AA240898385800282DD0BE25785BD9 +:103A0000B95D80B2884227D202F056FE002823D149 +:103A100002F0D4FDA04203D102F0FAFDA0421BD176 +:103A200008983858795B4901401807997958002956 +:103A300002D08847002808D0012804D108983858B7 +:103A4000795B4901401800F0CFFA785B401C78534D +:103A5000089979580029D3D1B85D06903546059864 +:103A60003E5A049881B200221A4802F031FE01F059 +:103A70007DFD069886422E46BCD301F08DFC04984D +:103A800084B2144D00222846214602F021FE01F0A6 +:103A900083FC039E00222846214602F019FE01F015 +:103AA00065FD02F009FE002802D0B8590028F1D1C6 +:103AB00005F046F901F0BEFD01F0BEFD054800220B +:103AC000214602F005FE0BB0F0BDC0461C1D0020D3 +:103AD000481F00201C1E002050720000645E000081 +:103AE000B901000004490840884203D1D0200349AD +:103AF00000220A5000207047030000801C1D002097 +:103B000070B594B014460A46014601A8FCF795FA30 +:103B100001460020002912D001A8027800216B463E +:103B20001960011D21250CAE2846334602F052FDD6 +:103B3000202228463146234602F0F8FC012014B02A +:103B400070BDF0B59DB0144613AAFFF7D9FF00254C +:103B5000002811D021266F4613AA01253046394688 +:103B60002B4602F0F3FC08373846FEF7AFFA204642 +:103B70003946324601F0A9FA28461DB0F0BD0000D2 +:103B8000F0B58BB00746119C012F17D0129E032F62 +:103B900012D1212205AF084611463A46FEF749FEEA +:103BA0000025684605601421384622463346FFF753 +:103BB0000FFE002836D136E0022F25D1039304945E +:103BC00005A81425457000240470861C212208468F +:103BD00011463246FEF72DFE022F0DD11099002915 +:103BE00008D06846056000220498334602F09AFB2C +:103BF000002817D1002516E06846039912C005A8D1 +:103C000016219623049D09E025460024684614C029 +:103C10000648301883B22122084611462A46FEF78C +:103C200037FE2C54012528460BB0F0BDFFFF0000E5 +:103C300070B59AB00E4604462069002500282AD0A7 +:103C4000217BA068401CFF31C9B211AA00252B4678 +:103C5000FFF777FF00281ED0F388B288A0680078AD +:103C6000716B33256E46B56004AD22C611A9FFF70E +:103C700087FF002500280ED0246904AD284605F0F2 +:103C80002DFC421C2846214605F09CFA0125002106 +:103C9000002800D00D4628461AB070BDF0B585B09A +:103CA0000A4606460020B07334460E34317B08299C +:103CB00027D803AF002101910825384602922A46F1 +:103CC00001F019FA327BA81A3818B16801F0FDF931 +:103CD000029D2735284605F001FCC6B2204629463C +:103CE000324601F0F2F92020A055A019421C02989A +:103CF000416C3846FEF7B0F8301820180199417031 +:103D0000012005B0F0BD000070B598B004466D46C6 +:103D10006021284605F040FAA16928461C3040225F +:103D200005F03EFC5C20295C0020002917D1227B95 +:103D3000082A14D8267D082E11D86D46A81A1430EA +:103D4000A16805F02FFAA81B1C302169324605F046 +:103D500029FA04486022294605F024FA012018B007 +:103D600070BDC0460018002010B50C490860FEF771 +:103D70003DF99320C0000A4901240C5401F03EFC97 +:103D80002102084805F008FA002004F01DF9204639 +:103D900004F01AF9FCF722FA10BDC046181D0020E5 +:103DA0007C1800201C1D002080B5064800780028E3 +:103DB00001D104F0A9FF044979440020024604F02F +:103DC0000FFB80BD1C1D0020845F000080B582B009 +:103DD00001900648784402F0DDF9293001A901225A +:103DE00002F038FBFFF7E0FF02B080BD286D000055 +:103DF00001460020022903D8880002497944085866 +:103E00007047C0469C5E000080B5012805D00028A0 +:103E100007D10020FFF7DAFF80BD0120FFF7D6FFB2 +:103E200080BD002003497944034A7A4404F066FFC8 +:103E300080BDC0461300000027000000014600209E +:103E4000012903D888000249794408587047C046C0 +:103E50005C5E000080B5002802D0FFF7A5FF80BDA2 +:103E60000648784402F096F92921435C0020044971 +:103E70007944044A7A4404F023FF80BD9A6C000020 +:103E80007DFFFFFF91FFFFFF80B5002003497944CC +:103E9000034A7A4404F032FF80BDC046ABFFFFFF07 +:103EA000BFFFFFFF80B5FF2002F0EEFB80BD80B5B5 +:103EB0000120FDF713FFFFF777FF80BD80B50020DD +:103EC000FDF70CFFFFF770FF80BD80B50120FDF707 +:103ED00013F9002800D080BDFFF766FF80BD80B5D4 +:103EE0000020FDF709F9002800D080BDFFF75CFF36 +:103EF00080BD80B50120FDF7FFF8002800D080BD0F +:103F0000FFF752FF80BD80B50020FDF7F5F80028CF +:103F100000D080BDFFF748FF80BD80B50120FDF7D0 +:103F2000EBF8002800D080BDFFF73EFF80BD80B5D4 +:103F30000020FCF7D9FCFFF737FF80BD80B50120DA +:103F4000FCF7D2FCFFF730FF80BD80B50020FCF706 +:103F5000CBFCFFF729FF80BD80B50120FCF7C4FC36 +:103F6000FFF722FF80BD80B50020FCF7BDFCFFF706 +:103F70001BFF80BD80B50120FCF7B6FCFFF714FFE6 +:103F800080BD80B50020FCF7AFFCFFF70DFF80BDC2 +:103F900080B50020FCF7A8FCFFF706FF80BD80B5C8 +:103FA0000120FCF7A1FCFFF7FFFE80BD80B50020DB +:103FB0000146FDF731FBFFF7F7FE80BD80B501201C +:103FC0000021FDF729FBFFF7EFFE80BD80B5002043 +:103FD000FCF78AFCFFF7E8FE80BD80B50120FCF706 +:103FE00083FCFFF7E1FE80BD80B50178490601D072 +:103FF00001F07CFB80BD0000B0B5054607202840DD +:104000000024012814D0022814D1002909D00B481B +:1040100002F046FB68B200280ADA02F011FA002426 +:1040200006E0FF2152310548002202F051FB044610 +:104030002046B0BD022001F07DF8C046E01F002000 +:10404000F0B581B0E04D28780C2810DD0D286CD03B +:104050000E2800D1C7E015280FD1DC48807901284F +:104060000BD1A879000708D4102001F063F80528C7 +:1040700000D111E10C2800D181E2D54C0027676006 +:1040800001202070204602F0CFFA042002F048FB05 +:104090006060692800D05DE101F0CCFA01F0CCFA53 +:1040A000BE25F84E7753042002F03AFB60600028EA +:1040B00000D164E2972800D161E2C0243059002881 +:1040C00000D15CE2705BAA27C421715C80B2884297 +:1040D00000D354E202F0F0FA002800D04FE202F0E0 +:1040E0006DFAB84204D102F093FAB84200D046E229 +:1040F0003059715B49014018CC217158002902D018 +:10410000884700280AD0012803D13059715B490142 +:1041100040180178490601D001F0E8FA705B401CB4 +:10412000705331590029CFD129E2D54C002767605F +:1041300001202070204602F077FA042002F0F0FA05 +:104140006060002800D11AE2972800D117E26928A0 +:1041500000D099E101F06EFA01F06EFABE25C94E69 +:104160007753042002F0DCFA6060002800D106E2F8 +:10417000972800D103E2C0243059002800D1FEE185 +:10418000705BAA27C421715C80B2884200D3F6E13B +:1041900002F092FA002800D0F1E102F00FFAB842E2 +:1041A00004D102F035FAB84200D0E8E13059715B31 +:1041B00049014018CC217158002902D088470028B5 +:1041C0000AD0012803D13059715B490140180178A8 +:1041D000490601D001F08AFA705B401C70533159D6 +:1041E0000029CFD1CBE1EA4D00276F600120287074 +:1041F000284602F019FA042002F092FA04466C6094 +:10420000692C00D0E6E001F015FA01F015FABE24A1 +:10421000E04E3753042002F083FA6860002800D192 +:10422000ADE1972800D1AAE1C0257059002800D13E +:10423000A5E1305BAA27C421715C80B2884200D31B +:104240009DE102F039FA002800D098E102F0B6F9B9 +:10425000B84204D102F0DCF9B84200D08FE17059C5 +:10426000315B49014018CC217158002902D08847A0 +:1042700000280AD0012803D17059315B4901401848 +:104280000178490601D001F031FA305B401C30530F +:1042900071590029CFD172E1BD4C00276760012020 +:1042A0002070204602F0C0F9042002F039FA606064 +:1042B000002800D163E1972800D160E1692800D08F +:1042C00018E101F0B7F901F0B7F9BE25B14E775307 +:1042D000042002F025FA6060002800D14FE1972801 +:1042E00000D14CE1C0243059002800D147E1705B77 +:1042F000AA27C421715C80B2884200D33FE102F05A +:10430000DBF9002800D03AE102F058F9B84204D1B4 +:1043100002F07EF9B84200D031E13059715B4901B9 +:104320004018CC217158002902D0884700280AD0B3 +:10433000012803D13059715B4901401801784906C1 +:1043400001D001F0D3F9705B401C70533159002942 +:10435000CFD114E1C0258F4C6059002800D106E16F +:10436000BE26A05BAA27C421615C80B2884200D32C +:10437000FDE002F0A1F9002800D0F8E002F01EF9FB +:10438000B84204D102F044F9B84200D0EFE06059DD +:10439000A15B49014018CC216158002902D088470F +:1043A00000280AD0012803D16059A15B49014018B7 +:1043B0000178490601D001F099F9A05B401CA05397 +:1043C00061590029CFD1D2E01C1E002034210020E9 +:1043D000481F0020D8206F4D2958002911D0642291 +:1043E00064290B4600D31346CA1A2A50D421002A46 +:1043F00007D16958002904D0DC22AA582A5000208D +:104400008847002C00D1BAE0972C00D1B7E0C02437 +:10441000285900282FD0BE26A85BAA27C421695C92 +:1044200080B2884227D202F047F9002823D102F057 +:10443000C5F8B84203D102F0EBF8B8421BD12859B5 +:10444000A95B49014018CC216958002902D088474E +:1044500000280AD0012803D12859A95B4901401836 +:104460000178490601D001F041F9A85B401CA8532E +:1044700029590029D2D1C420285CBE21695A7AE08A +:10448000481F00201C1D0020C025424C60590028F8 +:104490006DD0BE26A05BAA27C421615C80B2884291 +:1044A00065D202F009F9002861D102F087F8B8421C +:1044B00003D102F0ADF8B84259D16059A15B49016E +:1044C0004018CC216158002902D0884700280AD022 +:1044D000012803D16059A15B4901401801784906C0 +:1044E00001D001F003F9A05B401CA05361590029E1 +:1044F000D2D13CE0D020274C2058002803D0E978C6 +:10450000490801F037F9C025605900282FD0BE2690 +:10451000A05BAA27C421615C80B2884227D202F046 +:10452000CBF8002823D102F049F8B84203D102F0B9 +:104530006FF8B8421BD16059A15B49014018CC21EA +:104540006158002902D0884700280AD0012803D1E9 +:104550006059A15B490140180178490601D001F07A +:10456000C5F8A05B401CA05361590029D2D1C420DA +:10457000205CBE21615A814201D302F09DF802F015 +:104580009BF8002801D100F007FF012001B0F0BD29 +:10459000481F00201C1D0020B0B582B019481A4DDC +:1045A0002A18294615316846FEF745FB00240028E5 +:1045B00025D1164914316846082204F003FE00286C +:1045C0001DD100206877F5214A003D21C9006B5CB0 +:1045D0000A21002B05D0AB5C002B02D10121A9548C +:1045E0000021092212030A4BEA52FF225200022341 +:1045F000AB522975074990220A7048700124204661 +:1046000002B0B0BD7D0400007C180020001800201E +:1046100002020000E01F0020F0B583B02A4EB07FF8 +:1046200000280BD0294C204655302B4979440722CD +:1046300000F04BFD5C20002121543FE0244832185B +:104640003146153101A8FEF7F6FA224F3D680028E1 +:104650000DD04020285C082833D11C4C2046553012 +:104660001E497944062200F030FD5B3424E02735F2 +:10467000284604F033FF0246144C553420462946A0 +:1046800000F023FD3D682735284604F027FF202150 +:104690002154284604F022FF2018401C8121890063 +:1046A000705001A8FDF792FC05463868273004F0E9 +:1046B00015FF28182018441C00202070012003B08A +:1046C000F0BD0020FBE7C0467C1800200018002049 +:1046D0007D040000181D0020B15500008355000026 +:1046E000F0B5A5B01E4614460F460546FDF7D2FFAD +:1046F000002807D0A74979440A22204604F052FD39 +:1047000025B0F0BD0494A14800684024005D112844 +:1047100044D128463946FEF71CF803909B480068B0 +:10472000005D11283AD128463946FDF7D5FF00280B +:1047300012D07B208000039C002C07D09449085C99 +:10474000002803D0083D2846FDF7DCFC002C049827 +:104750007ED0924979447DE08C480068005D112844 +:104760001CD128463946FDF7EFFF002816D07B20E4 +:1047700080000399002907D08549085C002803D0F0 +:1047800028460838FDF7BEFC2C78FD2C7F4F64D1FD +:104790006878A97809020143C81C5FE02846FDF744 +:1047A000C5FD002810D079480068406B0028A7D0CC +:1047B00001F0F0FC0146A8786A461060EB1C00226C +:1047C000049801F0AFFD9BE7704F3868C488284615 +:1047D000FDF726FD0321002802D0386884880421D3 +:1047E000200A04D005AA54701070022702E005A820 +:1047F0000470012705A8C0196918142503902A46DA +:1048000000F063FCFF20EA306149085C002810D00A +:104810005E480068C28801200021944200D008460A +:104820006946086014210398049A3346FEF7D0FFC6 +:1048300066E7012069460C6048602F43B9B2B3B205 +:1048400005A8049C2246FEF723F80021215457E7CF +:104850005149794404F03AFE52E7601C2918153991 +:1048600020AE1422304604F09DFC307800281CD085 +:10487000002020A94E4A7A440B781C09145D05AD2E +:104880002C542C180F251D40535D6370491C801C4F +:104890002928F1D3282005AB002119544121454A8C +:1048A0007A44049801F0A2FA2AE703200121FD2CA2 +:1048B00000D00846295C4018295C4118039800285C +:1048C0000CD0685C0818401C295C00290AD04C29CF +:1048D00009D1291849784018801C04E068184078EC +:1048E000891C09E0401C291849784018801C295C63 +:1048F0000818401C295C491C08182A5C411C4C2AD9 +:1049000000D001466C186078A17809020143E07874 +:10491000227912020243100408431F901FA8204965 +:104920007944042204F008FE00280DD01FA81E4977 +:104930007944042204F000FE002800D0E0E61B4980 +:1049400079440B220498D9E63D68287919AE307075 +:1049500021461131701C15273A4604F023FCA88823 +:1049600001216A4603C205AD5023304639462A4626 +:10497000FDF78EFF002129544420205C6946086021 +:104980004121084A7A4404982B468BE7181D0020E1 +:104990007C180020EE5C0000AB530000985400002F +:1049A000E752000088520000F7520000B05A0000A1 +:1049B000B65300009D530000F0B597B001AD5024F0 +:1049C0002846214604F0E8FB4548464F391815A80B +:1049D0000822FDF79CFF444838187B2189002A46AD +:1049E0002346FFF77DFE414E40223046294604F023 +:1049F000D7FDA1208000385C142811D13C4838181C +:104A000040497944042200F07FFB002808D139484E +:104A100038183D497944042200F076FB00282FD055 +:104A2000354C374626682736304604F057FD024697 +:104A30003D4641352846314600F047FB266827367B +:104A4000304604F04BFD2021295430463E4604F008 +:104A500045FD2818401C81218900224A505015A884 +:104A6000FDF7B4FA05462068273004F037FD281812 +:104A7000401C3018412100224254012017B0F0BDE3 +:104A80001E48381801210022FDF71AFD0346304662 +:104A900041301F2B06D0032B07D0012B0BD11B4914 +:104AA000794404E01A49794401E01A49794406221C +:104AB00004F078FB04E01421174A7A4401F096F9D7 +:104AC00035464135284604F009FDC4B22819812134 +:104AD000890078500A483818FDF778FA2018C8E796 +:104AE0007A0200007C1800208202000000180020DA +:104AF0008502000089020000181D00208D020000C0 +:104B0000910200004C520000E7590000B351000030 +:104B1000B3510000B3510000AB51000070B58CB030 +:104B200020206946486004AE0E600C4894300C4D5D +:104B30002A46413201240023214601F0A7FC6846A1 +:104B4000082306601836436086604121054A7A448E +:104B5000284601F04BF920460CB070BD7C180020AF +:104B60000018002026510000F0B59BB007A8502186 +:104B700004F012FB4F4F39680020002959D10090F2 +:104B80004E4C0120029038604B482118264605AC57 +:104B90000825204601912A46FDF7B9FE39460C3119 +:104BA00020462A4604F00EFB002841D14448301824 +:104BB0007B21890007AD50232A46FFF791FD394636 +:104BC0001C31284604F03EFC0028344630D13D48D4 +:104BD000205C022808D14720000121584A1E22509B +:104BE00002230121002A30D08F20C500635901988B +:104BF000C118354A1646A25BD21A00F066FA60590F +:104C0000A15B081AA053029E7502605DEF2101406E +:104C10006155FBF7ADFE002804D001204002205C66 +:104C2000C006F6D5605DC00605D538680028A8D056 +:104C300000981BB0F0BD472000012158002000293A +:104C400000D006461F48235C3146022B19D10029AB +:104C500017D003201B4960541C48221821461531E7 +:104C600003A8FDF7E8FF002807D1143703A808229E +:104C7000394604F0A7FA002801D00020D9E71148EE +:104C8000235C0120032BD4D100206077F520410064 +:104C90003D20C000225C0A20002A05D0625C002A68 +:104CA00002D10120605400202075FBF745FE012051 +:104CB000BFE7C046001800207A0200007C180020E0 +:104CC000820200007C0400006E0400007D040000ED +:104CD00010B59320C0000F4C205C002802D0FFF7D5 +:104CE00043FF10BDFFF768FE4720000120580A4926 +:104CF0006158491C0B1A094855301421084A7A4456 +:104D000001F074F8074979440020024603F068FB7B +:104D1000012010BD7C180020740400000018002041 +:104D2000824F0000AA51000010B59320C0000E4C25 +:104D3000205C002802D0FFF72FFC10BDFFF76CFCB1 +:104D40000146002000290ED07B208000205C002836 +:104D500002D00649794401E0054979440020024621 +:104D600003F03EFB012010BD7C18002054520000CF +:104D70003A52000080B5FFF7D1FE03497944002084 +:104D8000024603F02DFB80BD7450000010B50446B0 +:104D900004497A22FDF7A2FE00212046FDF708FE15 +:104DA00010BDC04600180020B0B504460A4DC835F5 +:104DB000284604F093FB202129542918002048702C +:104DC000002C02D00649794401E0044979440246A6 +:104DD00003F006FBB0BDC046E01F002010530000EA +:104DE000F252000080B5034979440020024603F0E6 +:104DF000F7FA80BD6853000080B50349794400206C +:104E0000024603F0EDFA80BDC453000080B50549A9 +:104E10007A22FDF763FE044979440020024603F03C +:104E2000DFFA80BD001800204C54000080B5054911 +:104E30007A22FDF753FE044979440020024603F02C +:104E4000CFFA80BD00180020D854000080B5034977 +:104E500079440020024603F0C3FA80BD7C5500006F +:104E600010B58CB06C46204604F0D2FAA0850D49EE +:104E7000084206D1684601F047FC0A90FF2001F085 +:104E800003FC01F035FC6946884202D10A9801F022 +:104E90003BFC6846808D002801D10CB010BD00F0AD +:104EA00049F9C046FFFF0000F0B59FB00446002C52 +:104EB0002FD10DAC002648222046314600F01BF9C8 +:104EC000032525720D9633480E902046093034494B +:104ED00079440526324604F065F920461730314FF3 +:104EE0007F443946324604F05DF920462730394682 +:104EF000324604F057F926462D362B497944304680 +:104F00002A4604F04FF94020112121541A9604201A +:104F10001E9021480460214C01200102204604F02B +:104F20003BF901AD284604F073FAA88585B2002D3F +:104F30000BD001A8002181850B9801F0E5FB0B98AF +:104F400001F0E2FB102DE7D01FE001AD284601F093 +:104F5000DBFB0B9000F052FBFDF748F8002003F05C +:104F600033F8012003F030F8FEF71EFFFBF736F9A7 +:104F700001F0BEFBA84202D10B9801F0C5FB01A8CD +:104F8000808D0028C8D000F0D5F8FFF769FF1FB06A +:104F9000F0BDC0463A003200181D00201C1D002044 +:104FA000BB4D0000B04D0000994D0000F0B59FB022 +:104FB0000446A068002831D10DAD002748222846BC +:104FC000394600F098F80320009028720D97374872 +:104FD0000E90284609303749794405273A4604F0AF +:104FE000E1F828461730344E7E4431463A4604F004 +:104FF000D9F82846273031463A4604F0D3F82E46F1 +:105000002D362E4979443046009A04F0CBF84020E2 +:10501000112129541A9604201E90A5600027244EC1 +:1050200001AD284604F0F4F9A885304207D101A863 +:1050300001F06AFB0B90F8070FD001F001FB01F0C3 +:1050400057FB01A9884202D10B9801F05DFB01A832 +:10505000808D002828D10127E2E70A2001F0E4F939 +:105060006068022817D004280BD00328E5D1E06837 +:1050700000218161A168E068FEF7DAFDE1688861DE +:10508000DBE7E0680021C162A168E068FEF706FE88 +:10509000E168C862D1E7E068FEF736FE0028CCD0B0 +:1050A000A068FEF761FEC8E700F044F83A0032005D +:1050B000FFFF0000B34C0000A84C0000914C000022 +:1050C00080B5002001F020FB80BDB0B5884208D932 +:1050D000002A0FD0491E401E8B5C8354521EFBD108 +:1050E00008E0002A06D000239CB20D5D05555B1C2C +:1050F000521EF9D1B0BD80B50B46002A03D011462F +:105100001A4604F057F880BDB0B50023002A0FD02E +:10511000401E491E8C5C855C521EA54202D1002AAD +:10512000F8D105E00020C0430123A54200D8034682 +:10513000D8B2B0BD10B5044601F0DAFA214604F049 +:1051400073F9B0B582B0019200920023002A0BD00F +:10515000401E491E0023845C8D5C65402B43521E1B +:10516000F9D100200090019000980199884202D165 +:10517000D8B202B0B0BD0120FFF7DCFFF0B58BB0B4 +:105180000993844B109D2C461C400026002900D119 +:10519000AFE03746119E002E6DD00790089106961D +:1051A0000594581C04952840039000283E4604D1DD +:1051B00006980068002800D19BE00026002A0A9685 +:1051C00001D010680A900898022800D291E0129845 +:1051D000009000200190C4430998C0B20990089B38 +:1051E000079F0294991EB81C002900D180E03C78EA +:1051F0007E7875B2002D22DB07460B4635460998AE +:10520000844213D1002A3AD00798381A1060072137 +:1052100000240A9E864200D82146072906D000298C +:105220002DD000260A99814206D962E07F19AB424F +:10523000184600D328461B1A012BD3D858E08035D6 +:1052400056D07F252E400025002E11D002994E43C6 +:10525000DB1E00252946002B0FD007782D023D4389 +:105260005B1E761C401C002EF5D15B1C0746C6E772 +:1052700007460B46C3E73E463BE00E4639E005983D +:10528000984235D8854233D32E1A0098864202D0F0 +:10529000049800282CDB9E4200D31E4600988642CC +:1052A000024600D83246059C101908998C421FD836 +:1052B0008A421DD888421BD8079CA74218D305985C +:1052C000C119A14214D35018A04211D30A910899D0 +:1052D0006418BC420CD30A99A14209D8A04207D84D +:1052E0000398002808D00598C019069A106000E0BD +:1052F000019E30460BB0F0BD069800680499002965 +:1053000023DB0A99884228D9002A019EF1D0029E07 +:10531000941B0A990919891E80190019401EF41A54 +:10532000059B5B1E5B1BA34200D82346029C009D8D +:10533000641BA34200D823465B1C029D0C780470BA +:10534000491940195B1CF9D122E00A99FFF7F9FECF +:10535000012600220028CCD01AE0002A019EC8D0E5 +:105360000299CB1A0599491E491B994200D8194642 +:10537000029B009C1B1B994200D81946491C002324 +:105380000A9E9CB2355D0555491C5B1C0029F8D16D +:105390001646AEE7FFFFFF3F80B501F08DF900280C +:1053A00000D080BD064800214170602202700222B8 +:1053B0008270C1700171052101F072F980BDC04693 +:1053C0001C1E0020B0B51A48C078032807DC01284D +:1053D0000DD0022828D1174802F075F9B0BD042875 +:1053E0001FD0082820D1134802F06BF9B0BD114C32 +:1053F0000121204602F060F9204602F03FF90E4CF0 +:10540000A079002811D120460C300025042229461D +:10541000FFF771FE1034082220462946FFF76BFE85 +:10542000B0BD044802F04BF9B0BD1020FFF782FE7A +:105430001C1E0020F4210020342100207F21014087 +:105440000020032903D8C8B201490818007B70471F +:105450003421002080B516480179042918D002298A +:1054600006D0012922D1811D134802F00FF880BD1A +:10547000C2787F211140032918D8C9B24A000D4BC8 +:105480009A1800231382821D0B4802F084F880BD15 +:10549000C2787F211140032908D8C9B2054A5218A1 +:1054A00043791373821D044802F01EF880BDC04684 +:1054B0001C1E002034210020F421002070B5154668 +:1054C0000E460446FF2D1BD80E48502101702021A6 +:1054D00001714571E91C817080222243C270090A62 +:1054E0004170062101F0DCF83046294601F0D8F879 +:1054F0007F2020404000044908187D2109010182D5 +:1055000070BDC0461C1E00203421002080B50A4614 +:10551000014682201423FFF7D1FF80BD80B50A46E3 +:10552000014683201423FFF7C9FF80BD80B50C48D6 +:105530000178002900D080BD062181710A21017007 +:1055400008498B784A7812021A43FF232A339A4279 +:1055500000D31A464280C91C0348FFF7B6FD80BD40 +:10556000342100201C1E0020E01F0020B0B5204880 +:10557000827841780902114300780F280ADC0E284E +:1055800010D00F2823D10020012927D1FFF71AFFBF +:105590000120B0BD10281ED0162818D1FFF7C6FF75 +:1055A0000120B0BD13488168643181601621124A20 +:1055B000435A002B08D06424642B1D4600D3254693 +:1055C0005B1B435213420ED0891E0E29F0D10220DC +:1055D000FEF736FDB0BD0020032900D2B0BDFFF7B5 +:1055E00039FF0120B0BD002101701020FFF7A2FD9E +:1055F0001C1E002034210020FFFF0000B0B50A204F +:1056000000F012FF094C0025182220462946FFF71A +:1056100072FD65802570A571A56000F063FB0448EC +:1056200005604560FEF754F9B0BDC0463421002046 +:105630004C210020704700000248002101604160B9 +:105640007047C0464C210020F0B589B00546084699 +:1056500000F0A0FD0446002C43D02069002840D073 +:10566000284600F097FD014602AD1C222846019213 +:10567000FFF72BFD2168E98062682A81A0681A4F34 +:1056800065233B7089B292B24A434243D1084E1C13 +:1056900007231A4200D10E46314600910426864067 +:1056A00070181D30B870000A78700321384600F079 +:1056B000F7FF2846019900F0F3FFA0683870012138 +:1056C000384600F0EDFFE06800F064FDB1B200F094 +:1056D000E7FF009885B2206900F05CFD294600F0E4 +:1056E000DFFF09B0F0BDC0461C1E002070B500F001 +:1056F00051FD044620787F26064000F0DDFF00289B +:1057000030D1002E2ED0E06900281DD000F042FDDF +:105710000546052E02D1A07E002824D0284603F09D +:10572000DDFE064612486521017031461C3181704C +:10573000090A4170032100F0B3FF1C21204600F04C +:10574000AFFFB1B228460BE0094800214170652146 +:1057500001701C258570032100F0A2FF2046294618 +:1057600000F09EFF70BD20462946FFF76DFF70BD1B +:105770001C1E002070B50446002C28D01448066872 +:1057800045688E4201D16D1C45600E43002902D050 +:105790000660324605E00022026042600D4B5B1C51 +:1057A0001E438A4201D000214160082D0CD3032101 +:1057B000284603F001FC012290073043002900D065 +:1057C0003046D107884300E030462946A04770BDE7 +:1057D0004C210020FFFFFF7FF0B581B00F4E012468 +:1057E0003470B11CFF2750377A1C204600F03EFF72 +:1057F000054675707A1B7719F91C022000F036FFF8 +:10580000B8702D187619F47000F024FF30719020D4 +:1058100070710020B071E81D01B0F0BDE01F0020E4 +:10582000F0B58BB00A46064607210E4207D0334634 +:10583000D8B291B2FEF7E0FB80B20BB0F0BD4B20C6 +:10584000840083200390AA4DA84F3346019109E0BC +:105850006920A94908700398801C487002220199A8 +:10586000079B2DE1102130460840049292B2059228 +:10587000002A069600D1B5E0002800D0B2E00793D8 +:105880000091029007E0A1B20022384600F020FF0C +:10589000012000F03FF900F00FFF0028F3D17D2038 +:1058A0000001A9680E1828780928079A42DC072801 +:1058B00048D0092863D100218E48079101F0F8FBF8 +:1058C00010E0FFF769FDA1B20022384600F000FFAA +:1058D000A868B04200D3FEE0FFF748FE00F0ECFEFF +:1058E0000028F0D1834801F039F90028E9D0059A61 +:1058F000D01D4008A92800D3F3E003980D307E4B5B +:105900009854981807994170581D0499891C8AB2B7 +:1059100005921946FFF7D9FB052277480799FFF74B +:10592000EAFB0598401D83B272480399724A01F060 +:10593000D3FB3FE00A2804990AD00B2822D17148F2 +:10594000784401E06E487844059900F035FA31E07A +:105950002046253080B2059E864200D9C1E0532002 +:105960003870B970080A78700321384600F098FE44 +:105970006148314600F094FE002028701DE00028A8 +:1059800000D1ABE0D0B20599FEF736FB002811D06C +:10599000A4E0FFF701FDA1B20022384600F098FE16 +:1059A000A868B04200D396E0FFF7E0FD00F084FE67 +:1059B0000028F0D128780028EBD10020A8712870A9 +:1059C0006880069EB10600D536E7FFF7E5FC300695 +:1059D0000298009906D5089108AA484B1846114626 +:1059E00001DF0298002804D170066ED40020A8714F +:1059F00028700020688000F05FFE002801D1FFF7CA +:105A0000CBFCA1B200223846079200F061FE0228CA +:105A100006D8B9787A7812020A43D11C81423DD166 +:105A2000FFF7A4FD688829780029E4D00028E2D097 +:105A3000354979440422304E3046FFF765FB002893 +:105A40002ED03249794404223046FFF75DFB00280E +:105A50002BD02F49794404223046FFF755FB00280C +:105A600037D103982730C6B200F0D2FDB04200D043 +:105A7000EEE60120204E3070B01C402100F0BAFD4F +:105A80007070811C184A121D1140039B0D33735412 +:105A9000C11C114000237354021D10E00020A7E731 +:105AA000FFF79AFE0246002309E000207070039879 +:105AB0000D30307080200699014302220B46019977 +:105AC000DEB20B4200D1CDE6B2E668880649401846 +:105AD000B2E66888B0E61020FFF72CFB0920FFF73C +:105AE00029FB0220FFF726FBFBFF00001C1E002005 +:105AF0003421002054210020E01F0020BE9A0060C5 +:105B0000C3FBFFFFD9FBFFFFCE490000C1490000E6 +:105B1000B649000070B5044600F0CEFD002801D162 +:105B2000FFF73AFC4B2081000B4E002530462A46F9 +:105B300000F0CEFD3078152806D8012181400748B5 +:105B4000014201D0002C05D1FFF710FD01250028EE +:105B500000D10546284670BD1C1E00202070200084 +:105B600010B5FFF719FC084C4B208100002220469D +:105B700000F0AEFD20780E2801D0FFF7F7FC00F012 +:105B80009BFD0028F0D110BD1C1E0020F0B581B097 +:105B900000920F4604464B4EB74210D0494D0021AB +:105BA000402628463246FFF7A6FA009840280246CB +:105BB00000D3324628463946FFF787FA414EB0787F +:105BC00001280ADC002828D0012869D1F01C042112 +:105BD00000F04EFC402130462BE0022827D005285B +:105BE0005ED13079F17809020143374C20680027F3 +:105BF00081425BD1206800281ED03448009D2918BE +:105C0000334A13686D1FADB2AB4200D21168051D57 +:105C10000D4030480068711D34E0F01C002704225C +:105C20003946FFF768FA40213046A0473EE0254854 +:105C30004021A047002739E0B0797179090201437A +:105C40002548016001684908A8292FD80168204823 +:105C500001607178327812020A4320490A601D49B6 +:105C60001F4A0A60009D691F8AB218495218D21C47 +:105C70000368ED1FADB2AB4200D202680D1D1540A6 +:105C8000F11D17482A46FFF720FA11480168491B01 +:105C9000016010480168491901602068401C2060BB +:105CA0000B48016801200227002907D1064800217E +:105CB000016008480160064801603846C0B201B082 +:105CC000F0BDC04698210020D8210020FBFF000035 +:105CD000E0210020E4210020DC210020E821002038 +:105CE000E01F0020034800210160034801600348D1 +:105CF00001607047D8210020E4210020E02100202D +:105D0000F0B581B0264F3A68264C2168002921D091 +:105D1000002A1FD00090264D002140222846FFF780 +:105D2000EAF90520A87023480168090A297000686B +:105D300068701D490868000AE870086828710968D9 +:105D4000206800290ED03B263B2800D826683968F9 +:105D5000681D12E014480021016039601348017089 +:105D600021601BE03926392800D826682068000AFF +:105D700068712068A8713968E81D3246FFF7A5F9F7 +:105D8000009A09492068801B2060386880193860B3 +:105D90000868401C086006484021904701B0F0BDEB +:105DA000E4210020E0210020D8210020342100201F +:105DB00098210020E821002080B500290BD0064A58 +:105DC00000231360054A1160054A064B1360064A1A +:105DD0001160FFF795FF80BDD8210020E021002051 +:105DE000E4210020E01F0020DC21002081B0F0B57C +:105DF0008EB015460C4606901393022C00D2BAE1E1 +:105E00000698002800D1B6E1002D00D1B3E1069834 +:105E1000214603F0C1F913A809902978002900D17F +:105E2000A9E1671E002602E0A8194178761CC8B2D5 +:105E3000002801D02528F7D1BE4200D33E46069C5B +:105E400020462946324603F0B1F9BF1BA419069437 +:105E5000002F00D18FE1A95DAD19252900D087E180 +:105E60006B1C002020210A220892049005900790C4 +:105E70000446084604E009990A1D0992096804913C +:105E80001D46224629786D1C00242D29F9D047296A +:105E900018DC2F2926DD0B46303B0A2B00D366E1A8 +:105EA0003029044600D10C46079B002B00D0044645 +:105EB0000A23079843435818303807902B4620464A +:105EC0001446DDE7672904DD722921DD73293AD103 +:105ED00022E062293CDC48294BD101460120059093 +:105EE000084617E0252958D02A2926D02E2900D087 +:105EF0003DE129782A2900D03AE16A786B1C012417 +:105F00002A21482AB7D0682AB5D0732AB3D02FE106 +:105F1000682936D11021089109990B1D0993032393 +:105F200013400968012B00D1BBE0022B00D1BAE07D +:105F3000032B2B461446A3D0C6E0297802247329EC +:105F40002B4698D014E1752929D078291CD00EE170 +:105F5000632900D19BE0642900D008E102900397F7 +:105F60000998011D09910068C11742184A40C00FE5 +:105F70001CE0582900D0FAE00146012005900846AF +:105F800002E0702900D0F2E0029003970998011D09 +:105F9000099102680020102709E025207BE002908B +:105FA00003970998011D0991026800200A2701241E +:105FB00097420892049012D8012638460446394682 +:105FC00002F074FFB04209D1384660430799491E78 +:105FD0000791089988422646F0D900E03446079890 +:105FE000411E049B002B00D107990026F243002B91 +:105FF000029800D11A460192C2B2302A06D1002B73 +:1060000004D00AA82D23037000230126881E0D2822 +:106010000BD80AA83043491E049303F0CBF8049B25 +:106020000798801901994018461E002B03D00AA832 +:106030002D218155761C0598002C1AD0002802D0FD +:106040005348784401E05148784407900898214625 +:1060500002F02CFF394602F0AFFF0798405C0AA916 +:1060600088552046394602F021FF761CA742044697 +:10607000ECD9039FBE4200D33E460AA9069C2046A7 +:10608000324603F093F8BF1BA41906946DE00998FB +:10609000011D09910068069908707F1E491C069130 +:1060A00063E0049E16E00878002860D10499B942A4 +:1060B00000D339462022069C2046049103F07AF84A +:1060C00004983F1A24183DE000228B5C521C002BE0 +:1060D000FBD1561E089810282AD1002E47D0002444 +:1060E0003B46085D0F2202400009022B1F4642D3A7 +:1060F000059B002B05D0012B0ED10794224B7B442E +:1061000002E007941F4B7B44D2B29A5C069C6270FB +:10611000C0B2185C2070079C3846871E02282AD01F +:10612000641C0698801C0690B4423B46D9D30DE00F +:10613000BE4200D33E46069C2046324603F036F867 +:10614000BF1BA4190694002F079C14D0B4420ED98B +:10615000A41BBC4200D33C462022069E304621466A +:1061600003F028F83F1B36190696002F03D0297834 +:10617000002900D056E600200EB0F0BC02BC01B0F1 +:106180000847C0460943000021430000C743000000 +:10619000DD43000080B50449884204D303498842A6 +:1061A00001D200F005F880BD0000D0C040ABD0C0E7 +:1061B0007A460249C91C891A401A7047B161D0C099 +:1061C00010B54101104A0A40430E01210B405B42C9 +:1061D0000E4C1C405440820E0A4052420C4B13405D +:1061E0006340C20E0A4052420A4C14405C40020F07 +:1061F0000A405242084B13406340400F084041425E +:1062000006480840584010BDE0FFFF3FB2576A3BC8 +:106210006D8E5026FA19A11EDD33423DB362142A59 +:10622000F0B587B005930492064602910D780027D9 +:106230000120002D03971BD00298401C06900120DE +:1062400000272C46019721464139E2B2202A5FD32C +:10625000C9B21A295CD3FFF7B3FF01460698C25DA5 +:10626000E0200440600948407F1C002A1446EAD11F +:106270000599C919C91D5A2903994CD8FFF7A0FFE0 +:10628000002D0ED002994C1CFFF79AFF0146357085 +:106290001F2028404840611C761C2578002D0C46A4 +:1062A000F2D131213170711C06910599002914D069 +:1062B00000241A4E7E44039404990F5D1F2F29D8A1 +:1062C000F55DFFF77DFF06990D557840641C059933 +:1062D0008C42F1D30699091906910624FFF770FF45 +:1062E000641EFBD10121484019220D497944069BC7 +:1062F0000446D4401F2525404C5D1C70541F5B1C78 +:10630000002A2246F4D1002006998871012102E07A +:10631000019900E00399084607B0F0BD94340000ED +:106320005C340000F0B595B00C46054600200390A3 +:10633000102A1EDC1A99002A03D08E1E262E04D99C +:1063400017E0142901D0202913D104AE32700120A6 +:106350006A46082782C21060701C03A9052200F05B +:106360000AF80398431C0393284621463246FFF758 +:1063700057FF15B0F0BDF0B587B004930191054605 +:106380001046012383405C1E00270E9900910D9951 +:1063900002910C9A002A3E4627D0414205910026E0 +:1063A0003746029976188F4004990B781F43491C91 +:1063B0000491521E03928642069712DB01990B68E4 +:1063C000024620465C1C0C60059CA4192F46069DC5 +:1063D000E540044610462540FD543D46361A8642A7 +:1063E000EDDA039A002A069FDBD1009900290CD030 +:1063F000002E13D001990B68024620465C1C0C60ED +:10640000911B8F400740EF5408E0811B8F402740CD +:1064100000210298864202DA002F00D101210846AD +:1064200007B0F0BD01DF704780B584B0019003482C +:1064300001A9FFF7F7FF04B080BDC0463701006037 +:1064400080B582B002486946FFF7ECFF02B080BD1C +:106450003C02006080B586B001900291039203482F +:1064600001A9FFF7DFFF06B080BDC0467F030060D3 +:1064700080B584B00090019103486946FFF7D2FFD0 +:10648000019804B080BDC0462C05006080B588B07E +:1064900000900191029203930A9804900B98059042 +:1064A00003486946FFF7BEFF019808B080BDC046AB +:1064B0003B07006080B584B00190034801A9FFF755 +:1064C000B1FF029804B080BD7F08006080B584B041 +:1064D0000190034801A9FFF7A5FF029804B080BD11 +:1064E000DB0A006080B586B00090019102920393B0 +:1064F00003486946FFF796FF019806B080BDC04685 +:106500002C0B006080B588B000900191029203933B +:106510000A9804900B98059003486946FFF782FF9C +:10652000019808B080BDC0462B1A006080B586B0C7 +:10653000009001910292039303486946FFF772FFAE +:10654000019806B080BDC046EA2E006080B586B0D6 +:10655000009001910292039303486946FFF762FF9E +:10656000019806B080BDC0462E2F006080B58AB06D +:1065700000900191029203930C9804900D9805905D +:106580000E9806900F98079003486946FFF74AFF58 +:1065900001980AB080BDC046F338006080B586B06F +:1065A000019002910392044801A9FFF73BFF029872 +:1065B00080B206B080BDC0466E92006080B582B0E9 +:1065C00003486946FFF72EFF0198C0B202B080BDB4 +:1065D0004F9F006080B588B00190029103920493B0 +:1065E0000A980590024801A9FFF71CFF08B080BD7A +:1065F000BA53006080B584B00090019103486946A9 +:10660000FFF710FF019804B080BDC046FCA80060F1 +:1066100080B582B003486946FFF704FF0198C0B215 +:1066200002B080BD3CA0006080B584B001900348FA +:1066300001A9FFF7F7FE029804B080BD586400601E +:1066400080B582B002486946FFF7ECFE02B080BD1B +:106650008D68006080B582B003486946FFF7E2FEAE +:10666000019802B080BDC0466E6A006080B586B0F9 +:10667000019002910392034801A9FFF7D3FE02980B +:1066800006B080BDD474006080B584B0019003482A +:1066900001A9FFF7C7FE04B080BDC046BE9A0060E6 +:1066A00080B584B00090019102486946FFF7BAFEB8 +:1066B00004B080BD8183006080B582B00348694624 +:1066C000FFF7B0FE019802B080BDC046BB840060F9 +:1066D00080B586B0019002910392044801A9FFF7AA +:1066E000A1FE029880B206B080BDC046E48500607D +:1066F00080B582B003486946FFF794FE019802B066 +:1067000080BDC046B187006080B584B00190034869 +:1067100001A9FFF787FE029804B080BD758800606C +:1067200080B584B00190044801A9FFF77BFE029870 +:10673000C0B204B080BDC0468B9C0060F0B585B08F +:106740003A4A1278002A03D083213A4A7A440BE06D +:106750000A9A452A03D88321374A7A4404E0072954 +:1067600007D18321354A7A44022300F0B5FC05B0F5 +:10677000F0BD0192029040200393185C0490002821 +:1067800022D004980528039D08D1284641302C4981 +:1067900079440522FEF7B8FC002833D041350027A4 +:1067A000284E7E44049C0321384602F07FFB0221E0 +:1067B000C9434143705C297841402970641E761CAE +:1067C0006D1C7F1C002CEED145200399085C4630DF +:1067D000019A904210D141311548049C2246FEF79F +:1067E00074FC0720114988714C8009200870012130 +:1067F000029800F05DFCBAE78321134A7A44022331 +:106800000298B2E70A4D03222A70681C0F497944A6 +:10681000FEF75BFC281D0E4979440422FEF755FC67 +:106820002878431D832102982A469EE734210020C0 +:10683000E01F0020E53C0000D93C0000CF3C0000F8 +:10684000A73C00009B3C00004A3C00002F3C00009D +:10685000293C0000F0B581B01D460E46044628468E +:1068600000F016FC00280ED02068C11C090A6A46F8 +:106870009170811C090C5170411C090E1170001D92 +:106880002060D07004E0684604222946FEF71DFC13 +:10689000174F082238463146FEF717FC38460830B5 +:1068A00069460422FEF711FC002078730221397337 +:1068B0000121B973F8733874284600F0E9FB0146EA +:1068C000201D8625002906D029467931C9B2042227 +:1068D000FEF711FC03E069460422FEF7F6FB044ACA +:1068E00011232046294600F0F7FB01B0F0BDC04659 +:1068F000E01F0020F0B583B0029088794B791F0229 +:106900000743887801904B780E781546093DACB264 +:10691000A74204D0D01FD21F92B297421BD13D464E +:10692000002E08D083211C4A7A440223029800F0EA +:10693000D3FB03B0F0BD022B18DC012B23D0022BBC +:106940001DD1A8B26A461060CB1D002202980199A1 +:10695000FFF7F4FEEDE7E4B2A742E1D0D2B29742EE +:106960000546DDD083210D4A7A44DEE7032B0ED0A5 +:10697000C12B04D183210A4A7A440423D6E7832118 +:106980000A4A7A44D1E78321064A7A44CDE7832133 +:10699000054A7A440823C9E72C3B0000CB3A0000A3 +:1069A000D83A0000A53A0000B63A0000D43A0000F8 +:1069B00080B5C1698A784B781B0213430A78812A13 +:1069C00009D0832A0CD0862A0ED1C91C031D0022AF +:1069D000FFF740FF80BDCA1C812100F07DFB80BD18 +:1069E000C91C1A46FFF786FF80BD000070B50D4632 +:1069F0000146012A11D1094C20462A46FEF765FBC3 +:106A000060194026721B00252946FEF774FB812081 +:106A1000214632462B46FEF751FD70BD98210020DD +:106A20000282C1600022C282827642858284C16174 +:106A300002627047F0B583B00D4604462A20215CFF +:106A400020462A3001294AD000293BD12B2100229F +:106A5000625423462B332027E15DC91EC9B2264666 +:106A6000203601293ED8218BE28A91423CD9402030 +:106A7000012D00D038460290A07E03230126002875 +:106A800000D033460027012D3E4600D12E46B600E9 +:106A900033431E46029B9B1B891A1A46914200DC17 +:106AA0000A4691190291012D08D1211D2A48042777 +:106AB00001923A46FEF709FB019AA07E002820D0F9 +:106AC000FF302BE02521615C062908D12B21625C77 +:106AD0000023635423462B33002A03D1BBE72B202A +:106AE0000021215403B0F0BDFCD10021A176E18248 +:106AF00019700170B1803160E068E0611548017083 +:106B0000F0E74020205CB9B2134B585401203843C1 +:106B100081B2637E104F7B54471C207EB9B20E4B6E +:106B20005854E169002907D01746BAB29819E38A88 +:106B3000C918FEF7CAFA3A46E08A1018E082A07E29 +:106B4000401CA076029881B203482A46FFF74EFF08 +:106B5000C8E7C046342100209821002001462A20A1 +:106B60000A5C0120002A10D0012A01D100200CE08B +:106B700025200A5C0020062A07D12B200A5C012070 +:106B80000021002A01D0084670477047B0B52B217C +:106B900001244454011D0B4D04222846FEF795FAAA +:106BA00000206871832028710220A8716920E87193 +:106BB0007C20C043801C2872092128462246FFF70A +:106BC00015FFB0BD98210020B0B52B2101244454FD +:106BD000011D084D04222846FEF777FA002068714F +:106BE00088212971A871072128462246FFF7FEFE59 +:106BF000B0BDC04698210020F0B581B004462520E4 +:106C0000205C26462536002505286AD008784B7872 +:106C10001B0203438878CD782D02054328041843CE +:106C2000237965792D021D43A379E7793F021F433C +:106C30003B042B43834257D108790B1D658C002DF3 +:106C400013D02423E75C23462433B8424CD1278B4E +:106C5000401C18707B1B501F984200DB18464219DD +:106C6000628482B2208D491D23E07C25ED436D1D99 +:106C7000EFB28325B84204D12046FFF7A5FF0125D6 +:106C80002FE08F79497909023943C91CA8422BD1D9 +:106C9000208B8DB2A84227D189B2164D242700201F +:106CA000E055121F8A4200DB0A46628415401946ED +:106CB0002A46FFF773FC2085218B628C01258A42CE +:106CC0000FD3E18C88420FD1062030700020608401 +:106CD0002A20205C012804D12046FFF757FF00201E +:106CE0003070284601B0F0BD052030701020FEF74E +:106CF00021FAC046FFFF0000F0B589B004462372B8 +:106D00002020205C2646203603280AD02A25675DED +:106D100025462A35002F1BD02046FFF76DFF00289F +:106D200014D1D74806210172042131707A21C94358 +:106D30003A314022A1540830E0610020A076E08280 +:106D400001202083217A2046FFF774FE09B0F0BDB0 +:106D5000042809D12B2000272754A776E7822F701B +:106D6000B7803760E068E06108910020012B00D116 +:106D700018468700012039460143079191423BD8CC +:106D80000390012B06930492059707D1201D04223E +:106D90000899FEF79AF9059F049A069BE08A002855 +:106DA0000CD0012B24D120461230211D0422FEF7E5 +:106DB000ABF9059F049A069B002819D00321384699 +:106DC0000843904218D800910899C8190290C857F2 +:106DD0000F467A21C9437A3149B28525884225DD9B +:106DE000A7480421017231703A3540216554A2E769 +:106DF00002203843904202D9A148852193E72120FF +:106E0000205C984246D13078012851D1012B7FD1A6 +:106E1000211D042208980392FEF776F9059F0028A9 +:106E200076D097480621017203997EE70195012BE0 +:106E300014D1307801281ED1251D2146123104229B +:106E40002846FEF761F9069B002807D002980078D3 +:106E50000199491CC9B2884200D0E8E03078012885 +:106E600009D1012B00D080E0029800780199491CDB +:106E7000C9B2884279D1079978184078795C0F02B5 +:106E80000743208AC01E87421FDD7D48009901729A +:106E900004216DE07A20C04301460831784A11721E +:106EA000042131703A30402160540832E26144E7F5 +:106EB000012B56D12B2000212154A176E18229708B +:106EC000B1803160E068E06140E702980078812895 +:106ED00005D08628019D51D0832800D097E0012B52 +:106EE00057D1251D67497944042228460892FEF7A8 +:106EF0000BF9002807D06449794404222846FEF79C +:106F000003F9002845D15E480B21017208992FE052 +:106F1000089AD119D05DA27E904222D10498079A96 +:106F2000851AE08A228B121A954200DB1546AFB211 +:106F3000E2691018491C3A46FEF7C7F8069901297C +:106F400008D1E08AE1690918E08C3A46FFF726FB90 +:106F50000699E084E08A2818E082A07E401CA07692 +:106F60003CE0474804210172DFE6454804210172F4 +:106F70003170019A3A3240216254DCE6012B6AD129 +:106F8000201D4249794404252A46FEF7BDF8002811 +:106F900070D004980599451AFF1CBD4200DB3D46A0 +:106FA000AAB2E06902990892FEF78FF8069B012BBE +:106FB00006D1E1690020089AFFF7F0FA069BE08409 +:106FC000212023542783E5820020A076204612301A +:106FD000211D04221D46FEF778F82946E08A012982 +:106FE00001D1218B06E0218BCA1C824202D22448A7 +:106FF000032198E6884204D20020606301203070AB +:10700000A4E6022030702046FFF7D2FC9EE61C4822 +:10701000039B037204213170019A3A324021625479 +:107020000830E0610020A076E08223838AE6144CD9 +:10703000042220462946FEF748F800206071019896 +:107040003A302071039AA2710620E071082120468F +:10705000FFF7CCFC7AE60A48039A027204213170E9 +:107060003A35402165540830E0610020A076E08286 +:10707000228367E602480B210172357079E7C0462A +:10708000982100207235000064350000D8340000DB +:1070900080B5064979440422FEF736F801460120FE +:1070A0000022002900D0104680BDC046C433000035 +:1070B00080B52A22835C02462A32002906D0002BA2 +:1070C00008D101211170FFF761FD80BD012B01D1B5 +:1070D0000220107080BD000070B504462A20205C9C +:1070E000002809D0012824D02520205C062820D1A2 +:1070F0002B20205C00281CD1202003252554402073 +:1071000021540020A076E261E08223832120215CCB +:107110002546213503290DD1084E3078002808D0A6 +:10712000032100E029782046FFF784FC307800280E +:10713000F8D170BD2046FFF77DFC70BD34210020E2 +:10714000024900200860024908607047F0210020D1 +:10715000EC21002010B50748002444704F21017035 +:10716000012181700221C1700421FFF799FA2046A4 +:1071700010BDC0461C1E002070B582B06D460024B4 +:107180006C704F262E700220A8700320E8702C71BE +:1071900005212846FFF784FA6C702E700120A87034 +:1071A000E87004212846FFF77BFA204602B070BD44 +:1071B00010B582B001A8002444704F210170012154 +:1071C00081700221C1700421FFF76AFA204602B0E3 +:1071D00010BD0000B0B582B014480024046014480B +:1071E00004606D464F2028706C700520A870042044 +:1071F000E870012028716971AC71012A05DC002A50 +:107200000AD0012A0AD1042006E0022A03D0032A68 +:1072100004D1022000E00320694688716846C371EA +:107220000821FFF73DFA002002B0B0BDF021002098 +:10723000EC21002010B582B06846002444704F2233 +:107240000270052282700422C27001220271417113 +:107250008471C4710821FFF723FA204602B010BDE3 +:10726000B0B582B00D4668460024447050210170CC +:1072700003218170C5704021017144710621FFF71F +:107280000FFA8020054201D0074800E00548016858 +:107290007F2215400122AA400A430260204602B024 +:1072A000B0BDC046F0210020EC21002070B582B0B6 +:1072B0000D466846002444705021017003218170FE +:1072C000C5708026067144710621FFF7E9F9354241 +:1072D00001D0074800E0054801687F2215400122DF +:1072E000AA4091430160204602B070BDF021002009 +:1072F000EC2100208020014201D0064800E0044833 +:1073000002787F2001400120884010407047C0462D +:10731000F0210020EC21002010B582B06846002446 +:1073200044704F220270022282700322C2700171E7 +:107330000521FFF7B5F9204602B010BDB0B582B007 +:107340001C461546684650220270C170202101710A +:107350004471E11C8170090A41700621FFF7A0F910 +:1073600028462146FFF79CF9002002B0B0BD10B5B9 +:1073700082B0684600244470502303700323837056 +:10738000C1703021017142710621FFF789F9204651 +:1073900002B010BD70B515460E4604460220002C02 +:1073A0000FD0D421204601F0F7FE002E01D0B020EE +:1073B00026509C200121215425702046FFF7C0FE55 +:1073C0000020C0B270BDB0B504469C2001212154FC +:1073D000B4256059002806D04068FEF7DBFE02465F +:1073E0002179204690470835CC2DF2D12046FFF771 +:1073F000DFFE2046FFF7AEFE0020B0BD0223002ACC +:1074000007D00023022804D8C0000818B421425035 +:107410000023D8B2704780B5FFF7AEFE002080BDD4 +:10742000F0B581B00C4605460026B4272846314603 +:1074300000F066F9002807D0E8590068FEF7AAFEB8 +:1074400002462846214690470837761C032EEDD188 +:10745000002001B0F0BDF0B581B00C460546002615 +:10746000B4272846314600F04BF9002807D0E859E8 +:107470004068FEF78FFE02462846214690470837AF +:10748000761C032EEDD1002001B0F0BDB0B504464E +:107490002546A835284600F077FB9420012121508D +:1074A000AE20205A98216050A820215C1F2008405F +:1074B000022808D001280BD000280ED120462946EA +:1074C00000F02BF90EE02046294600F0D8FA09E03A +:1074D0002046294600F0AFFA04E080200140204613 +:1074E000FFF7BEFE0020B0BDF0B583B002920446A7 +:1074F000019100291CD025469C350027B426204642 +:10750000394600F0FDF800280DD0A0598069002808 +:1075100009D02978032906D1FEF73CFE0346204610 +:107520000199029A984708367F1C032FE7D12FE074 +:107530009420205803282BD1E16D206E81420AD976 +:10754000091AE165814200D301468AB220460299B8 +:1075500000F0C7FD1CE026469C360025B4272046D7 +:10756000294600F0CDF800280BD0E059006900282A +:1075700007D03178032904D1FEF70CFE01462046DE +:10758000884708376D1C032DE9D1204600F0B0FD77 +:10759000002003B0F0BDF0B581B004460091002991 +:1075A0001BD027469C370026B4252046314600F0E4 +:1075B000A7F800280CD060594069002808D0397815 +:1075C000032905D1FEF7E6FD0246204600999047C3 +:1075D0000835761C032EE8D14DE09420205802286F +:1075E00042D1E069266AB0420AD9D022A15889194D +:1075F000A150801BE06182B2204600F064FD33E0C0 +:10760000A5692846314601F0D7FCB5420FD30029C1 +:107610000DD19820205826469836854207D200255D +:10762000204629462A4600F04EFD35601CE02646DD +:107630009C360025B4272046294600F061F8002832 +:107640000BD0E059C068002807D03178032904D155 +:10765000FEF7A0FD01462046884708376D1C032D24 +:10766000E9D1204600F050FDA020205CA034012884 +:1076700001D100202070002001B0F0BD70B504469B +:107680009C20012121544020206220660025B42640 +:107690002046294600F034F8002807D0A059406859 +:1076A000FEF778FD024621792046904708366D1C8A +:1076B000032DEDD1002070BD017400207047002023 +:1076C00070470020704770B504469C20205C03285A +:1076D00014D10025B4262046294600F011F80028D0 +:1076E00008D0A059C069002804D0FEF753FD014618 +:1076F0002046884708366D1C032DECD1002070BD54 +:1077000002460020022907D8C8001018B4214158A9 +:107710000120002900D10846704780B54A78042A24 +:1077200008DD072A0FDC052A14D0062A1BD100F039 +:1077300021F81DE0002A10D0012A17D0032A12D107 +:1077400000F034F914E0082A0AD0092A0BD100F01D +:10775000BDF80DE000F094F80AE000F005F907E04C +:1077600000F0EBF804E000F0E3FB01E000F03BF98F +:10777000002080BDB0B582B00D46044601A80021AE +:1077800001806A88100A052812DC01281CD0022812 +:1077900024D0032837D1D0B2022839DC00285FD0AA +:1077A000012865D002282ED1B0202058C0680EE0F4 +:1077B00006281CD0072823D00F2824D1B020205819 +:1077C000C069002803D11EE0B02020580068FEF7F1 +:1077D000E1FC0246207C01A990472FE0B42020580C +:1077E00000282CD0217C002922D0C06A21E0207CF6 +:1077F000002808D1B4202058002804D0406B18E09D +:10780000207C00280ED02046294600F091FB25E080 +:10781000032829D004282FD00528F4D1B0202058DF +:107820008069D4E7B42020580028ECD0006B00E039 +:10783000806AFEF7AFFC014601A88847014601A80F +:107840000288002A0AD0E888002807D0824200D3A4 +:10785000024601A80280204600F020FC02B0B0BD24 +:10786000B02020584068B2E7B02020580069AEE749 +:10787000B02020588068AAE7B02020584069A6E7C9 +:1078800070B50446888800280BD1C888002808D124 +:1078900048887F2606409C20205C25469C3503288E +:1078A00003D1204600F044FB70BD9E202654F1B267 +:1078B0002046FFF731FD204600F01AFC002E02D0D2 +:1078C0000220287070BD0120287070BD70B50D4673 +:1078D0000446AE78022E1DD29C20215C20469C30AE +:1078E000032907D0022915D1002E22D0666003217A +:1078F000017009E0002E12D06068B04219D0C1B208 +:107900002046FFF7A8FD666020463146FFF788FD58 +:1079100002280ED12046294600F00AFB70BD022144 +:107920000170666020463146FFF795FD204600F065 +:10793000DFFB204600F0DCFB70BD80B5CA88012A61 +:107940000AD19C22825C032A09D0022A04D1002198 +:1079500081600146083103E000F0EAFA80BD011DB4 +:10796000012200F09BFB80BDB0B504469C20205C4A +:10797000FE220240022A15D10120E060A4202158F5 +:1079800025460C350320002905D0204600F0BCFB1D +:10799000E16802200843E06002222046294600F008 +:1079A0007DFBB0BD204600F0C3FAB0BDB0B50D46BA +:1079B00004466888012815D1A42001212150287986 +:1079C00002280CD8C0002018B4214058002806D046 +:1079D0008068FEF7DFFB0246204629469047204696 +:1079E00000F086FBB0BDB0B50D4604469C20205C7F +:1079F000FE210140022919D1688801281AD1A4204A +:107A000000212150287902280CD8C0002018B42168 +:107A10004058002806D08068FEF7BCFB024620468E +:107A200029469047204600F063FBB0BD204629461A +:107A300000F07EFAB0BDB0B50D4604469C20205C37 +:107A4000032816D12879022813D8C0002018B421A1 +:107A5000405800280DD08068FEF79CFB0246204667 +:107A600029469047E888002807D1204600F040FBCF +:107A700003E02046294600F05BFA0020B0BDB0B517 +:107A80000D4604462878602202402979202A0FD129 +:107A900002290DD8C8002018B4228058002807D029 +:107AA0008068FEF777FB024620462946904769E04A +:107AB0006878002816D001281DD0032862D19C20A8 +:107AC000205C03281BD16888002807D18020084348 +:107AD000802803D02046FFF7C3FB297902294ED81E +:107AE000C80040E09C20205C032817D0022810D159 +:107AF00048060AD146E09C20205C032827D00228B3 +:107B000007D18020084380283CD02046FFF7A8FBFF +:107B100038E02046294600F00BFA33E07F20084089 +:107B2000000120180546543514308022114200D03F +:107B300005462046FFF7DEFB0121002800D1014663 +:107B4000296002222046294600F0A8FA1AE0688837 +:107B5000002817D1480612D02046FFF7A7FB287946 +:107B600002280CD8C0002018B4214058002806D0A4 +:107B70008068FEF70FFB02462046294690472046C4 +:107B800000F0B6FA0020B0BD0A7802704A78427060 +:107B90008A78CB781B02134343800A794B791B0206 +:107BA000134383808A79C97909021143C1807047E0 +:107BB00010B504468021FFF753FB00212046FFF754 +:107BC0004FFB10BD70B582B00D46044601A90020E0 +:107BD0000880694608702A7860211140002910D079 +:107BE000202938D169780A460A3A022A33D3022971 +:107BF0001BD0032919D02046294600F099F902200C +:107C000029E069780B2913D00A290ED0062922D140 +:107C10006888000A002221280ED02228114616D199 +:107C200001AE304600F058F80AE0694601220EE045 +:107C3000204600F05DFA0DE001AE304600F032F86B +:107C400001463288E888824200D3024632802046CC +:107C500000F024FA0020C0B202B070BDF0B581B0CF +:107C6000044682210326402532462B46FFF7B2FA0E +:107C700002272046394632462B46FFF7ABFA20460C +:107C800039462A46FFF773FB002001B0F0BD10B55E +:107C900004468221FFF7CEFA02212046FFF7CAFAF6 +:107CA000002010BDAC21094A515C0922012905D0F0 +:107CB000002906D107497944092204E0044979449E +:107CC00001E000221146028008467047F42100209E +:107CD000A2270000B6270000F0B581B00446AC2012 +:107CE0001349085C2221002819D001281AD1104814 +:107CF0008121032740263A463346FFF76BFA0125D8 +:107D00000B4829463A463346FFF764FA08482946A5 +:107D10003246FFF72CFB08487844222104E005484E +:107D2000784401E000210846218001B0F0BDC04642 +:107D3000F4210020772700005D270000F0B581B016 +:107D4000044681210326402532462B46FFF742FA9E +:107D500001272046394632462B46FFF73BFA20469C +:107D600039462A46FFF703FB002001B0F0BD0000B2 +:107D700080B5012903D103480121FEF75BFE0020F5 +:107D800080BDC04654210020B0B5144601290DD154 +:107D9000012540222946FFF7EAFA2846FDF74EFB67 +:107DA0000246034821462B46FEF7A6FF0020B0BD41 +:107DB0005421002080B5022903D103487844FDF7FF +:107DC0009FFF002080BDC0464DD7FFFFB0B51446D1 +:107DD000022919D102214022FFF7C9FA0B4DA879D7 +:107DE000002811D10220FDF729FB024609487844FA +:107DF0002146FDF7CBFE022806D10720287001207E +:107E0000A8710348006868800020B0BD34210020BC +:107E1000DC2100201BD7FFFF70B50446832103251A +:107E200040262A463346FFF7D5F9204629462A46FA +:107E30003346FFF7CFF9204629463246FFF797FA37 +:107E4000002070BD002070470020704780B50329D6 +:107E500003D103487844FDF753FF002080BDC0469E +:107E6000C5D6FFFFB0B51446032919D1032140221E +:107E7000FFF77DFA0B4DA879002811D10320FDF7FB +:107E8000DDFA0246094878442146FDF77FFE0228C4 +:107E900006D10B2028700520A8710348006868806F +:107EA0000020B0BD34210020DC21002093D6FFFF4C +:107EB00012200880014878447047C0468628000098 +:107EC00004200880014878447047C0468828000094 +:107ED0000E200880014878447047C0467C28000086 +:107EE0000E200880014878447047C0467A28000078 +:107EF0000A200880014878447047C046782800006E +:107F00000E200880014878447047C0465A28000077 +:107F10000E200880014878447047C0464A28000077 +:107F200039200880014878447047C04693250000F6 +:107F300080B50A7852B2002A02DBFFF739FE80BD15 +:107F40004A78772A0FD0062AF7D14A88194B9A42E5 +:107F5000F3D1CA881221122A00D30A46164979445D +:107F600000F09CF880BD8A88042A09D1CA8828219B +:107F7000282A00D30A461149794400F08FF880BDC1 +:107F80008A88052A09D1CA889221922A00D30A46F2 +:107F90000B49794400F082F880BD8A88072ACCD149 +:107FA000CA88B221B22A00D30A460649794400F0B1 +:107FB00075F880BDEE030000B6250000AE25000078 +:107FC000BC2500003426000070B504462348002577 +:107FD000D4222946FDF78FF8214E30460C3004227A +:107FE0002946FDF788F81036082230462946FDF765 +:107FF00082F8002C2DD0194C0025D4222046294689 +:10800000FDF779F81949794420462A46FFF7C2F965 +:10801000174A7A4428462146FFF7F0F90120154A0D +:108020007A442146FFF7EAF9FF2252320D480E4901 +:10803000FEF7F6FC0220104A7A442146FFF7DEF9EB +:10804000032140222046FFF792F92046FFF7E3F98B +:1080500070BD0248FFF7B7F970BDC046F42100209B +:108060003421002054210020E01F0020EE240000D5 +:1080700082260000AC260000CC2600006021018092 +:10808000014878447047C046F62600000A21018066 +:10809000014878447047C04646270000B0B50C46FA +:1080A000942102234350D02144508261C261016A6D +:1080B000914200D80A4693B2002529462246FFF78E +:1080C0003DF92846B0BDB0B50C46016A914200D8D2 +:1080D0000A4693B2002529462246FFF72FF9284683 +:1080E000B0BD10B500242146FFF741F9204610BD70 +:1080F00010B59421042242500024214622462346F2 +:10810000FFF71CF9204610BD10B5942105224250FE +:10811000002421462246FFF72AF9204610BD000020 +:10812000B0B512490A780120012A1DD8521E0C232D +:108130005343CB181A8B002A16D01969002913D083 +:108140009B8A002B06D194000C190325ED4364593A +:10815000E41C09D1934206D29A0089180322D24323 +:108160008958891C00D00020B0BDC0461C1D0020CD +:1081700010B50E490A780120012A16D8521E0C2388 +:108180005343CB181A8B002A0FD0196900290CD041 +:108190009B8A541E9C4208DD921E9A4204DD9A007E +:1081A00089184968891C00D0002010BD1C1D0020C2 +:1081B0000848017800290AD00C224A4380184189D6 +:1081C000028901208A4203D8FF208A4200D300207E +:1081D00040B270471C1D0020F0B581B00146164A20 +:1081E0001078012826D8401E0C234343D218168B42 +:1081F000002E1FD01569002D1CD0022E1AD3948A90 +:1082000013461433771EA74214DDB61EA6420ADBBE +:10821000A600AD196D68AE1C0CD0ED1C03D1002179 +:108220001980D18204E0D482621C1A80002901D016 +:1082300000F03EF801B0F0BD1C1D002080B501200B +:10824000FFF7CAFF80BD0000B0B5174908780128C4 +:1082500029D8401E0C22424389180A8B002A22D0BA +:108260000C69002C1FD0022A1DD38D8A0B461433B3 +:10827000002D0AD0AA00A2180324E4431259921C2C +:1082800011D0CD82691E19800BE095006419032579 +:10829000ED436459E41C06D1044C14191C80521E91 +:1082A000CA8200F005F8B0BD1C1D0020FEFF0000D2 +:1082B000F0B581B004460C2060431A490E183069AD +:1082C000B18A890040583746143710360321C94314 +:1082D000884224D8FDF75EFF31683A8892008958B9 +:1082E00005680846FDF756FF002D06D00068FDF72B +:1082F00051FF01462046884711E08068FDF74AFF9C +:1083000005463068398889004058FDF743FF4068CA +:10831000FDF740FF02462046294600F061F801B013 +:10832000F0BDC0461C1D0020F0B581B02B4D287853 +:10833000012825D8401E0C2670432A18108B0028CF +:108340001ED0116900291BD0928A824218D2900057 +:108350000858FDF71FFF806829784C1E66430028E7 +:1083600010D0A8190169808A80000858FDF712FF13 +:108370008068FDF70FFF01460022204600F030F82C +:1083800001B0F0BDA819038B002BF9D0828A0146F9 +:1083900014319B1E9342F3DB05699600AE190096DB +:1083A0007768FE1C13D0BE1CEAD1009E7668B61C0E +:1083B00009D1521C96B2B34204DBB600AE197668FE +:1083C000B61CF6D00A80C282501C088002E000224F +:1083D0000A80C2822046FFF76BFFD1E71C1D0020F8 +:1083E000F0B583B001920C460C2211460290414335 +:1083F0001F4B5F180021398339617961181DFCF723 +:108400007AFE20463C4610343D4618353E46163628 +:10841000143700282AD0FDF7BDFE206029888A0085 +:108420008258521C06D0491C8AB292008258521CB3 +:10843000F9D129800198002815D0FDF7ABFE05463B +:1084400020683988890040580BE0FDF7A3FEA84258 +:1084500009D038883080401C388080B28000216884 +:108460000858411CF1D10298FFF722FF03B0F0BD7C +:108470001C1D002080B50A49884208D0094988425D +:1084800008D00949884208D1FFF7DEFE05E0FFF772 +:108490004BFF02E00120FFF79FFE002080BDC04699 +:1084A00003000080020000800100008010B501463A +:1084B000002000290FD1084C218BA28A8A420AD2BF +:1084C0002069FDF767FEA18A89004058FDF762FE2A +:1084D0004068FDF75FFE10BD1C1D002080B50348FD +:1084E0000078401EFFF7E2FF80BDC0461C1D002043 +:1084F00010B5044600F07CFC2420604308490818AD +:10850000C42105224254C021064A7A444250BD216A +:1085100001224254D021044A7A44425010BDC04640 +:108520001C1D0020DA22000059FFFFFF80B500F07B +:1085300041FB9D22002806D003498A5C112A02D102 +:10854000B422024B8B5280BD1C1D00200A8000000B +:1085500010B50446FFF7CCFF2420604304490818F7 +:10856000CC21044A7A444250204600F017FC10BD4A +:108570001C1D0020C5FFFFFF80B500F01BFB9D22E6 +:10858000002806D003498A5C102A02D3B422024B89 +:108590008B5280BD1C1D00200A80000010B50446CF +:1085A000FFF7A6FF2420604304490818CC21044AA1 +:1085B0007A444250204600F0F1FB10BD1C1D002003 +:1085C000C5FFFFFF70B50546FFF788FF0446114E53 +:1085D00030469C3020222946FCF777FD687801461A +:1085E000103905290AD29D20305C0F2101408800F6 +:1085F0002058B82170509C36304670BD022803D0F8 +:108600000128F8D1616800E0E16800200029F2D17A +:10861000F3E7C0461C1D002010B5044600F0E8FB3F +:10862000242060430B490818C42106224254C0216B +:10863000094A7A444250BD2101224254CC21074AC2 +:108640007A444250D021064A7A444250204600F0F3 +:10865000A5FB10BD1C1D00205222000081FFFFFF62 +:1086600029FEFFFFF0B587B00E46FFF71FFF06900B +:108670004B4C20460C300025022729463A46FCF791 +:108680003AFD20460E30059529463A46FCF733FD63 +:10869000701C049002D0A06800287DD00698406825 +:1086A000FDF778FD054600F019FF29180122059213 +:1086B000012871DB60680590A0680290002003909B +:1086C000069001952B468B42039C1A4620D200202F +:1086D0001A46044626469D19C01D741C722813D8DC +:1086E0002F781F2F04DD202F09D02D2F07D003E076 +:1086F000092F04D00A2F09D05F2F00D015462A4633 +:108700001D198D42E6D303E0344601E09A19741C2A +:108710001819884224D2002C069D22D09A4220D0DB +:108720000025ED43455D2C2D06DC2E46093E022E2C +:1087300016D3202D14D003E02D2D11D05F2D0FD096 +:1087400000782C2805DC0546093D022D08D3202899 +:1087500002E02D2804D05F28069D02D0D41A00E044 +:10876000069D0498002806D00598A84203D10598D4 +:10877000029A90420AD31B19681C8B4200D32846E8 +:108780008B4206909FD3401C059005E004480146AB +:10879000CC810198181A8881059807B0F0BDC046B1 +:1087A0001C1D0020B0B50446FFF7A2FE094D696804 +:1087B0002046FFF757FF242060432818CC21064AA3 +:1087C0007A444250D021054A7A444250204600F073 +:1087D000E5FAB0BD1C1D00201D00000015010000C1 +:1087E000F0B583B00546FFF779FE0446374E3046B4 +:1087F0009C3020222946FCF768FC6878102816DC9B +:10880000012833D002283BD010285AD120680028F4 +:1088100041D0B468FDF7BEFC03467068B1686A4693 +:10882000401C03C2012C41D82A4A7A4440E0014648 +:108830001139032945D20F210840401E4000371846 +:10884000FD89002D3DD06068FDF7A4FCB989401872 +:108850006946086034461C348021204A7A44204608 +:108860002B46FDF7C3FAB82034502AE0FFF758FC36 +:1088700001460020002924D07168002923D020E07F +:10888000FFF776FC00281CD07168B068421E0020FB +:10889000914216D117E07168B0686A4610603046A0 +:1088A0001C304B1C80210C4A7A4404E0084A7A446C +:1088B00030461C308021FDF799FA30461C30B82133 +:1088C00070509C36304603B0F0BDC0461C1D0020E1 +:1088D0009620000021140000A7200000F9200000CD +:1088E00080B5174988420BD01649884213D01649E3 +:1088F000884222D11548416800291CD0491E14E045 +:1089000012498868002803D04968401E884214D163 +:10891000FFF70AFD11E00D4841688268521E91423E +:1089200002D1FFF78BFC08E0491C41600078401E33 +:10893000FFF738FF01E0FFF787FC002080BDC0464D +:108940000300008002000080010000801C1D002048 +:1089500070B50446FFF72CFC01280BD0401C0FD14A +:108960001C4E301D00250C222946FCF7C4FBE843B1 +:10897000706005E01748001D00210C22FCF7BBFBCE +:10898000204600F035FA2046FFF790FD40680028A9 +:1089900019D00020C1432046FFF764FE0D4DA860AA +:1089A000002807D1281D00210C22FCF7A4FBA86891 +:1089B000002804D0401E6968814200D968602046C2 +:1089C000FFF7F0FE70BD0348001D00210C22FCF7EC +:1089D00092FB70BD1C1D002070B50546FFF77EFDA3 +:1089E0000446124E30469C3020222946FCF76DFB8F +:1089F00068780F2806DC01280AD0022812D1FFF778 +:108A0000B7FB07E010280AD011280BD1606807E0F7 +:108A1000FFF786FB01460020002903D070BD2068C7 +:108A2000B82170509C36304670BDC0461C1D0020D9 +:108A300010B5044600F0DCF9242060430B49081807 +:108A4000C42105224254C021094A7A444250BD2122 +:108A500001224254CC21074A7A444250D021064A8E +:108A60007A444250204600F099F910BD1C1D0020A8 +:108A7000121F00007DFFFFFF11FAFFFF70B50546D2 +:108A8000FFF72CFD0446164E30469C302022294626 +:108A9000FCF71BFB68780F2807DC012812D002289E +:108AA00013D00F2818D1206809E01038022813D2FB +:108AB0009D20305C0F210140880020184068B821BB +:108AC000705009E0FFF72CFB01E0FFF751FB014676 +:108AD0000020002900D070BD9C36304670BDC046D5 +:108AE0001C1D002010B5044600F082F924206043CC +:108AF00008490818C42106224254C021064A7A4473 +:108B00004250BD2101224254D021044A7A444250AD +:108B100010BDC0461C1D0020FE1E000065F9FFFFB1 +:108B200010B5044600F064F9242060430B4908188E +:108B3000C42106224254C021094A7A444250BD2130 +:108B400001224254D021074A7A444250CC21064A9D +:108B50007A444250204600F021F910BD1C1D00202F +:108B6000C21E000029F9FFFF29FFFFFF80B5FFF7B4 +:108B700085FF9D22002806D003498A5C102A02D373 +:108B8000B4220A238B5280BD1C1D002010B5044660 +:108B9000FFF7A8FF2420604304490818CC21044AA9 +:108BA0007A444250204600F0F9F810BD1C1D002008 +:108BB000C9FFFFFF70B50546FFF790FC0446124E53 +:108BC00030469C3020222946FCF77FFA687802283C +:108BD00004D0012809D1FFF7A3FA01E0FFF7C8FA92 +:108BE0000146002000290BD070BD9D20305CF02193 +:108BF000084205D00F21084080002058B82170504D +:108C00009C36304670BDC0461C1D0020B0B51749CB +:108C1000884211D01649884215D01649884222D17F +:108C2000F820154C2158E0256059401E884700283F +:108C300019D06059401E11E0E0200F490858FC226D +:108C4000895888470FE0F8200B4C2158E0256059DF +:108C5000401C8847002806D06059401C605120788D +:108C6000401E00F00BF80020B0BDC046030000809D +:108C700002000080010000801C1D0020F0B581B0C2 +:108C800004460120C6430C4D2F46E437F8202958EE +:108C9000E02028583018884701C7761C032EF5D1EC +:108CA0002046FFF7B9FC242060432818D021034A4E +:108CB0007A44425001B0F0BD1C1D002059FFFFFF57 +:108CC000B0B50446F8200B4D2950E0202B50FC2075 +:108CD0002A502046FFF7EAFBE435A84206D00649B1 +:108CE000794400222046FFF77BFBB0BD2046FFF70A +:108CF000C5FFB0BD1C1D0020EC1D000080B5002389 +:108D0000FFF7DEFF80BD0000B0B50C4D28780028CD +:108D100011D12846BC30002424222146FCF7EBF96F +:108D200028780C225043281810302146FCF7E3F92C +:108D30002878401C2870C0B2401EB0BD1C1D002009 +:108D4000F0B581B0144E3078AA2700281ED0401EFE +:108D50003070C0B2242460433018BC21475CBC3062 +:108D6000002529462246FCF7C6F930780C225043EC +:108D7000301810302946FCF7BEF93078002805D0AD +:108D8000444331199A2200238B5201E0777000206E +:108D9000401E01B0F0BDC0461C1D0020B0B5044609 +:108DA00012480278002A0ED0611C91420BD1242176 +:108DB00061434518FCF73EFCBE20002129522046A5 +:108DC00000F02AF8B0BD01210023002A0A4600D095 +:108DD0001A46641C00D019461143012904D1417878 +:108DE000AA2901D169214170B0BDC0461C1D0020D7 +:108DF00070B52424604307490E18FCF71BFC30466D +:108E0000BC30002529462246FCF775F9BC203554B4 +:108E100070BDC0461C1D0020F0B581B00446042082 +:108E2000FDF77EFC00283CD097283AD024206043F0 +:108E30001D490C18C02020582546C0352646BE3690 +:108E400000282ED02046CC300090C4343088AA2789 +:108E5000217880B2884224D2FDF72EFC002820D150 +:108E6000FDF7ACFBB84203D1FDF7D2FBB84218D1F5 +:108E7000286831884901401800990968002902D002 +:108E80008847002807D0012803D128683188490184 +:108E90004018FBF7A9F83088401C30802968002969 +:108EA000D6D101B0F0BDC0461C1D002000224308F1 +:108EB0008B4274D303098B425FD3030A8B4244D3A2 +:108EC000030B8B4228D3030C8B420DD3FF220902E4 +:108ED00012BA030C8B4202D31212090265D0030BA3 +:108EE0008B4219D300E0090AC30B8B4201D3CB0399 +:108EF000C01A5241830B8B4201D38B03C01A5241DB +:108F0000430B8B4201D34B03C01A5241030B8B42DC +:108F100001D30B03C01A5241C30A8B4201D3CB02C7 +:108F2000C01A5241830A8B4201D38B02C01A5241AC +:108F3000430A8B4201D34B02C01A5241030A8B42AF +:108F400001D30B02C01A5241CDD2C3098B4201D3C7 +:108F5000CB01C01A524183098B4201D38B01C01A45 +:108F6000524143098B4201D34B01C01A52410309BC +:108F70008B4201D30B01C01A5241C3088B4201D36B +:108F8000CB00C01A524183088B4201D38B00C01A18 +:108F9000524143088B4201D34B00C01A5241411A3F +:108FA00000D20146524110467047FFE701B500204C +:108FB00000F0F0F802BDC0460029F7D076E7704710 +:108FC00003460B437FD4002243088B4274D303092A +:108FD0008B425FD3030A8B4244D3030B8B4228D3CB +:108FE000030C8B420DD3FF22090212BA030C8B42F1 +:108FF00002D31212090265D0030B8B4219D300E091 +:10900000090AC30B8B4201D3CB03C01A5241830B15 +:109010008B4201D38B03C01A5241430B8B4201D3C5 +:109020004B03C01A5241030B8B4201D30B03C01AEE +:109030005241C30A8B4201D3CB02C01A5241830A68 +:109040008B4201D38B02C01A5241430A8B4201D397 +:109050004B02C01A5241030A8B4201D30B02C01AC1 +:109060005241CDD2C3098B4201D3CB01C01A524128 +:1090700083098B4201D38B01C01A524143098B42B1 +:1090800001D34B01C01A524103098B4201D30B019A +:10909000C01A5241C3088B4201D3CB00C01A5241BF +:1090A00083088B4201D38B00C01A524143088B4284 +:1090B00001D34B00C01A5241411A00D2014652411D +:1090C000104670475DE0CA0F00D04942031000D33C +:1090D0004042534000229C4603098B422DD3030A91 +:1090E0008B4212D3FC22890112BA030A8B420CD3A1 +:1090F000890192118B4208D3890192118B4204D3CA +:1091000089013AD0921100E08909C3098B4201D349 +:10911000CB01C01A524183098B4201D38B01C01A83 +:10912000524143098B4201D34B01C01A52410309FA +:109130008B4201D30B01C01A5241C3088B4201D3A9 +:10914000CB00C01A524183088B4201D38B00C01A56 +:109150005241D9D243088B4201D34B00C01A52412D +:10916000411A00D20146634652415B10104601D3BA +:109170004042002B00D54942704763465B1000D344 +:10918000404201B5002000F005F802BD0029F8D0EA +:1091900016E770477047C04610B5002200F00AF885 +:1091A00010BDC04610B500F031F810BD10B500F08C +:1091B0007FF810BD0B0010B511001A0000F0D4F8B4 +:1091C00010BDC04630B5032A0CD903000B439B07E2 +:1091D00019D103680C68A34215D1043A0430043154 +:1091E000032AF6D8551E002A0BD0002303E05A1C90 +:1091F0009D4206D01300C25CCC5CA242F7D0101B8B +:1092000000E0002030BD551EEFE7C046F0B5C64671 +:1092100000B50F2A41D903270D003E0005430C007D +:1092200003002E402F423DD11500103D2D09AC46C4 +:109230002D01A8468044256867681D605F60A568A9 +:10924000E7689D60DF6010341F0010334745F2D19E +:1092500065460F230C2401352D014919134045198A +:10926000144222D08C59AC5104369C1B032CF9D8E3 +:109270000324043B9B0801339B002240ED18C918CE +:10928000561E002A06D00023CC5C1A00EC54013391 +:109290009642F9D180BCB846F0BD0500561E002AA2 +:1092A000F1D1F7E70500561EEDE71A00F6E7C046D4 +:1092B000F0B5C64600B588420CD98B18984209D241 +:1092C000531E002A03D0CA5CC254013BFBD280BCAF +:1092D000B846F0BD0F2A0BD80500561E002AF6D05E +:1092E0000023CC5C1A00EC5401339642F9D1EEE72E +:1092F00003270D003E0005430C0003002E402F42C3 +:109300002CD11500103D2D09AC462D01A8468044F6 +:1093100025681F001D6065685D60A5689D60E56843 +:109320001034DD6010334745F2D165460F230C241D +:1093300001352D01491913404519144211D08C599A +:10934000AC5104369C1B032CF9D80324043B9B0826 +:1093500001339B00ED18C9182240BEE70500561ED8 +:10936000BEE71A00B9E7C046F0B5050083074AD04A +:10937000541E002A44D003000322CEB202E001357D +:10938000013C3DD301332E701342F8D1032C2FD969 +:10939000FF220A40150215432A0415430F2C35D924 +:1093A0002700103F3F093E01B4461E001A00103648 +:1093B0006644156055609560D5601032B242F8D1B0 +:1093C0000F260C2201373F012640DB1937002242CD +:1093D00017D03E1FB608B400A4461A001C1D6444F2 +:1093E00020C2A242FCD103240136B6009B193C40A6 +:1093F000002C05D0C9B21C19197001339C42FBD155 +:10940000F0BD3400F4E714000300BFE72700E0E7F5 +:10941000F0C041464A4653465C466D4676467EC09D +:109420002838F0C80020704710307CC89046994614 +:10943000A246AB46B54608C82838F0C8081C00D17B +:1094400001201847024670B50A4392072AD11E4DE3 +:10945000EE0104C808C9541B9443344017D0D0B25D +:10946000D9B2401A2106014310D190B299B2401AE4 +:10947000210401430AD110021902000A090A401A04 +:109480002102014302D1100E190E401A70BD9A42FA +:10949000DFD010BA19BA884201D9012070BD00206E +:1094A000C04370BD02780B7801300131002A09D029 +:1094B0009A4207D102780B7801300131002A01D09D +:1094C0009A42EFD0D01A70BD0101010103000A7861 +:1094D00001311A700133002AF9D1704710B58307A2 +:1094E0000AD00300032102E001330B4205D01A78B1 +:1094F000002AF9D1181A10BD030019680C4A0D4C46 +:109500008A188A4322420FD15968094A04338A18BB +:109510008A43224208D15968054A04338A188A438B +:109520002242F1D000E001331A78002AFBD1E1E7B2 +:10953000FFFEFEFE8080808030B5002A28D0030028 +:109540000B439B0713D1032A11D9134D0BE0043AA7 +:10955000002A1DD0114C1C199C432C4218D10430F8 +:109560000431032A03D903680C68A342EFD00478BE +:109570000D78A5420ED1012A0AD0012306E0C45C71 +:10958000CD5CAC4206D101339A4201D0002CF6D119 +:10959000002030BD601BFCE780808080FFFEFEFE67 +:1095A000F0B50C00044303000600A40712D1032AFF +:1095B00010D9144CA44666460D68134C1F002C1994 +:1095C000AC4334421CD10433043A1E0004313D60E4 +:1095D000032AF0D80024B71806E00D5D013A35558E +:1095E000BB1A0134002D02D0002AF6D1F0BD0021B3 +:1095F000D418002AFAD0197001339C42FBD1F5E748 +:109600001E00E7E780808080FFFEFEFE30B505008B +:1096100008002B006C18002903D106E001339C429E +:1096200003D01A78002AF9D1581B30BD253038589C +:10963000001976A91488AC17A914873DA9148720AE +:109640009EC9845ACB02FAB24E1C0368B3B517C147 +:10965000A4488FBA97F0E3459AC053EA010000008E +:1096600003C01F02B41600142200203F76A91488FC +:10967000AC209EC9845ACB02FAB24E1C0368B3B523 +:1096800017C1A4488FBA97F0E3459AC053EA010086 +:10969000000003C01F02B425750031323334353663 +:1096A00037383941424344454647484A4B4C4D4E72 +:1096B000505152535455565758595A616263646514 +:1096C000666768696A6B6D6E6F70717273747576B8 +:1096D0007778797A205369676E6564204D65737376 +:1096E0006167653A0AE0E0E0E0E0E0E0E0E0E0E069 +:1096F000E0E020222426404244484A4EC0C41601DD +:10970000010001010101010101000000DD17D0C0CD +:10971000191DD0C07103D0C01917D0C0C105D0C069 +:109720001D04D0C05D12D0C04D14D0C09D10D0C05B +:10973000A91CD0C0E503D0C02503D0C05502D0C0BD +:10974000626974636F696E636173680071707A72C5 +:1097500079397838676632747664773073336A6E35 +:1097600035346B686365366D7561376C0050656EB6 +:1097700064696E67004C656467657220726576691E +:10978000657700000300000000008000200000005A +:109790000100000000000000FFFFFF0000000000CB +:1097A00000000000070100000C0080002000000005 +:1097B00000000000FFFFFF00000000000880000024 +:1097C0006D97D0C007010000180080002000000045 +:1097D00000000000FFFFFF00000000000880000004 +:1097E0007597D0C000000000FFFFFF000000FEC121 +:1097F000FF3030EC0D03C3DE3030EC0D03C3C0F09E +:109800003FF80700000000000E0000000E000000FE +:1098100001000000E497D0C0EC97D0C00000000029 +:10982000FFFFFF00000000000C400BF807FCC0F336 +:10983000F03CF003FE012D000300000000000000DA +:109840000E0000000E000000010000001C98D0C0B7 +:109850002498D0C000000000FFFFFF00008001E658 +:10986000C071383807FC001E8007F003CEC1E13814 +:1098700070061800000000000E0000000E0000003E +:10988000010000005498D0C05C98D0C000000000D7 +:10989000FFFFFF00000000000C8007F003FEC1FF87 +:1098A000F03FF003CC0033C00C00000000000000CB +:1098B0000E0000000E000000010000008C98D0C0D7 +:1098C0009498D0C000000000FFFFFF004111050187 +:1098D000070000000400000001000000C498D0C090 +:1098E000CC98D0C000000000FFFFFF000000000087 +:1098F0001EE01F1C0E03638C19630C0C87837F8092 +:1099000007000000000000000E0000000E00000034 +:1099100001000000E498D0C0EC98D0C00000000026 +:10992000FFFFFF004812420804000000070000008B +:10993000010000001C99D0C02499D0C00000000094 +:10994000FFFFFF0021842401040000000700000045 +:10995000010000003C99D0C04499D0C00000000034 +:10996000FFFFFF00088A280807000000040000002D +:10997000010000005C99D0C06499D0C000000000D4 +:10998000FFFFFF00000000000000C000380067E09B +:10999000381C9C037E000F800100000000000000C6 +:1099A0000E0000000E000000010000007C99D0C0F5 +:1099B0008499D0C000000000FFFFFF0000003000CD +:1099C0000C80072001CC0033E01C3807FFC3F3F8FC +:1099D0007CFE1F00000000000E0000000E000000D2 +:1099E00001000000B499D0C0BC99D0C04175746F1B +:1099F00020417070726F76616C004D616E75616CA4 +:109A000020417070726F76616C004261636B005030 +:109A100075626C6963206B657973206578706F720D +:109A200074004170706C69636174696F6E00697372 +:109A30002072656164790053657474696E677300A0 +:109A400056657273696F6E00312E352E3300517575 +:109A50006974005369676E006D65737361676500B3 +:109A60004D65737361676520686173680043616E5B +:109A700063656C007369676E617475726500526529 +:109A800076696577007472616E73616374696F6E75 +:109A900000416D6F756E740041646472657373008C +:109AA000466565730041636365707400616E642090 +:109AB00073656E640052656A656374004F505F534E +:109AC000454E44455200436F6E6669726D0054689E +:109AD000652064657269766174696F6E0070617487 +:109AE0006820697320756E757375616C210044651B +:109AF0007269766174696F6E207061746800526576 +:109B00006A65637420696620796F75277265006ED7 +:109B10006F74207375726500417070726F76652086 +:109B200064657269766174696F6E00417070726FFE +:109B3000766500436F6E6669726D20746F6B656E3B +:109B4000004578706F7274007075626C6963206B89 +:109B500065793F00546865206368616E67652070B1 +:109B600061746800697320756E757375616C00436C +:109B700068616E6765207061746800546865207361 +:109B800069676E2070617468005369676E20706148 +:109B9000746800556E766572696669656420696EE1 +:109BA000707574730055706461746500204C656451 +:109BB000676572204C697665006F722074686972FF +:109BC000642070617274790077616C6C65742073C5 +:109BD0006F66747761726500436F6E74696E756548 +:109BE00000554E4B4E4F574E005245574152440080 +:109BF0004F505F53454E4445525F43524541544593 +:109C0000004F505F435245415445004C0E968C0026 +:109C100044656C656761746520746F202573202826 +:109C200066656520256420252529003D666E8B002C +:109C30003031323334353637383941424344454682 +:109C40000043616C6C20636F6E74726163742025D5 +:109C500073006F6D6E69004F4D4E4920005553449F +:109C60005420004D41494420004F4D4E492061731E +:109C70007365742025642000252E2A482E2E2E255B +:109C80002E2A48006F757470757420232564005166 +:109C900074756D005154554D00716300EC99D0C03E +:109CA000FA99D0C00A9AD0C00F9AD0C00A9AD0C0F0 +:109CB000229AD0C02E9AD0C09D85D0C0B09CD0C072 +:109CC0000000000000000000893ED0C0000000003D +:109CD0000000000000000000C89CD0C0FFFFFFFF94 +:109CE0004098D0C0379AD0C0318AD0C0E09CD0C054 +:109CF000D89CD0C000000000409AD0C0489AD0C084 +:109D00005185D0C0F89CD0C00000000000000000C9 +:109D1000A53ED0C0000000000000000000000000D0 +:109D2000109DD0C0FFFFFFFFB098D0C04E9AD0C0AA +:109D3000318AD0C0289DD0C0209DD0C00000000036 +:109D4000B89CD0C0E89CD0C0009DD0C0309DD0C091 +:109D5000FDFFFFFFFFFFFFFF0898D0C0539AD0C060 +:109D6000589AD0C08D8BD0C0589DD0C00000000044 +:109D700000000000609AD0C0001800205189D0C0B7 +:109D8000749DD0C00000000000000000AF3ED0C0B5 +:109D90000000000000000000000000008C9DD0C00A +:109DA000FFFFFFFFA099D0C0539AD0C0589AD0C0EF +:109DB000218BD0C0A49DD0C09C9DD0C000000000CD +:109DC000BD3ED0C000000000000000000000000008 +:109DD000C09DD0C0FFFFFFFF7898D0C06D9AD0C063 +:109DE000749AD0C0218BD0C0D89DD0C0D09DD0C097 +:109DF00000000000649DD0C07C9DD0C0B09DD0C04C +:109E0000E49DD0C0FFFFFFFF0899D0C07E9AD0C06C +:109E1000551800208D8BD0C0089ED0C000000000D7 +:109E200000000000919AD0C0411800205189D0C094 +:109E3000249ED0C00000000000000000989AD0C00E +:109E4000001800205189D0C03C9ED0C00000000006 +:109E500000000000CB3ED0C0000000000000000069 +:109E600000000000549ED0C0FFFFFFFFA099D0C0AB +:109E7000A59AD0C0318AD0C06C9ED0C0649ED0C09C +:109E800000000000DF3ED0C0000000000000000025 +:109E900000000000849ED0C0FFFFFFFF7898D0C074 +:109EA000B59AD0C0318AD0C09C9ED0C0949ED0C0FC +:109EB00000000000149ED0C02C9ED0C0449ED0C094 +:109EC000749ED0C0A49ED0C0FFFFFFFF0899D0C0F1 +:109ED000C69AD0C0859AD0C08D8BD0C0CC9ED0C041 +:109EE0000000000000000000A09AD0C0551800201B +:109EF0005189D0C0E89ED0C00000000000000000E2 +:109F0000F33ED0C000000000000000000000000090 +:109F1000009FD0C0FFFFFFFFA099D0C0A59AD0C07E +:109F2000AC9AD0C0218BD0C0189FD0C0109FD0C099 +:109F300000000000073FD0C000000000000000004B +:109F400000000000349FD0C0FFFFFFFF7898D0C012 +:109F5000B59AD0C0318AD0C04C9FD0C0449FD0C0E9 +:109F6000000000001B3FD0C0000000000000000007 +:109F700000000000649FD0C0FFFFFFFFA099D0C089 +:109F8000539AD0C0BC9AD0C0218BD0C07C9FD0C087 +:109F9000749FD0C000000000D89ED0C0F09ED0C0FA +:109FA000249FD0C0549FD0C0FFFFFFFFD89ED0C0D9 +:109FB000F09ED0C0889FD0C0549FD0C0FFFFFFFF4D +:109FC000D899D0C0CE9AD0C0DD9AD0C08D8BD0C0E9 +:109FD000C09FD0C00000000000000000EE9AD0C07A +:109FE000001800205189D0C0DC9FD0C000000000C4 +:109FF000000000002F3FD0C0000000000000000063 +:10A0000000000000F49FD0C0FFFFFFFF7898D0C091 +:10A01000FE9AD0C00F9BD0C08D8BD0C00CA0D0C0FA +:10A0200004A0D0C000000000A099D0C0189BD0C0F0 +:10A03000769BD0C08D8BD0C028A0D0C0000000007F +:10A0400000000000989AD0C0A82000205189D0C0FC +:10A0500044A0D0C000000000000000003D3FD0C080 +:10A060000000000000000000000000005CA0D0C064 +:10A07000FFFFFFFFA099D0C02B9BD0C0318AD0C07A +:10A0800074A0D0C06CA0D0C0000000004B3FD0C076 +:10A090000000000000000000000000008CA0D0C004 +:10A0A000FFFFFFFF7898D0C0B59AD0C0318AD0C0EA +:10A0B000A4A0D0C09CA0D0C000000000CC9FD0C005 +:10A0C000E49FD0C018A0D0C034A0D0C0FEFFFFFFD6 +:10A0D0004CA0D0C07CA0D0C0ACA0D0C0FFFFFFFF80 +:10A0E0004CA0D0C07CA0D0C0ACA0D0C0FFFFFFFF70 +:10A0F000593FD0C000000000000000000000000038 +:10A10000F0A0D0C0FFFFFFFFA099D0C0339BD0C00C +:10A11000A8200020218BD0C008A1D0C000A1D0C0B1 +:10A1200000000000673FD0C00000000000000000F9 +:10A130000000000024A1D0C0FFFFFFFF7898D0C02E +:10A14000B59AD0C0318AD0C03CA1D0C034A1D0C013 +:10A150000000000014A1D0C044A1D0C0FFFFFFFF49 +:10A16000753FD0C0000000000000000000000000AB +:10A1700060A1D0C0FFFFFFFFA099D0C0419BD0C01D +:10A18000489BD0C0218BD0C078A1D0C070A1D0C0D6 +:10A1900000000000833FD0C000000000000000006D +:10A1A0000000000094A1D0C0FFFFFFFF7898D0C04E +:10A1B000B59AD0C0318AD0C0ACA1D0C0A4A1D0C0C3 +:10A1C0000000000084A1D0C0B4A1D0C0FFFFFFFFF9 +:10A1D0000899D0C0549BD0C0649BD0C0218BD0C004 +:10A1E000D0A1D0C000000000000000006F9BD0C0D4 +:10A1F000001800205189D0C0ECA1D0C000000000A0 +:10A2000000000000913FD0C00000000000000000EE +:10A210000000000004A2D0C0FFFFFFFF7898D0C06C +:10A22000FE9AD0C00F9BD0C0218BD0C01CA2D0C042 +:10A2300014A2D0C0000000009F3FD0C0000000006A +:10A24000000000000000000038A2D0C0FFFFFFFFA8 +:10A25000A099D0C02B9BD0C0318AD0C050A2D0C012 +:10A2600048A2D0C000000000DCA1D0C0F4A1D0C042 +:10A2700028A2D0C058A2D0C0FFFFFFFF0899D0C0CD +:10A280007B9BD0C0649BD0C0218BD0C07CA2D0C0AF +:10A290000000000000000000899BD0C000180020D2 +:10A2A0005189D0C098A2D0C000000000000000007A +:10A2B000AD3FD0C000000000000000000000000022 +:10A2C000B0A2D0C0FFFFFFFF7898D0C0FE9AD0C0E8 +:10A2D0000F9BD0C0218BD0C0C8A2D0C0C0A2D0C01C +:10A2E00000000000BD3FD0C00000000000000000E2 +:10A2F00000000000E4A2D0C0FFFFFFFFA099D0C083 +:10A300002B9BD0C0318AD0C0FCA2D0C0F4A2D0C058 +:10A310000000000088A2D0C0A0A2D0C0D4A2D0C0AB +:10A3200004A3D0C0FFFFFFFFD899D0C0939BD0C03B +:10A33000318AD0C028A3D0C0000000000000000077 +:10A34000A59BD0C0AC9BD0C09D85D0C040A3D0C041 +:10A350000000000000000000B99BD0C0C89BD0C026 +:10A360009D85D0C058A3D0C00000000000000000B0 +:10A37000CD3FD0C000000000000000000000000041 +:10A3800070A3D0C0FFFFFFFF7898D0C06D9AD0C0F7 +:10A39000318AD0C088A3D0C080A3D0C00000000004 +:10A3A000DB3FD0C000000000000000000000000003 +:10A3B000A0A3D0C0FFFFFFFFA099D0C0D89BD0C002 +:10A3C000318AD0C0B8A3D0C0B0A3D0C00000000074 +:10A3D00030A3D0C048A3D0C060A3D0C090A3D0C049 +:10A3E000C0A3D0C0FFFFFFFF4F505F5245545552EE +:10A3F0004E000000556E64656C6567617465000011 +:10A4000000000000B001000000B0A7000000B00292 +:10A410000000003031323334353637383961626309 +:10A42000646566303132333435363738394142432A +:10A430004445466F00900167006985F1D000000037 +:10A44000004254430090009000006A805532465FFD +:10A4500056329000010990006E006D00FFFFFFFF73 +:10A46000000000000921110121012222000000004A +:10A4700009211101000122220006D0F10901A101E8 +:10A480000903150026FF0075089540810809041589 +:10A490000026FF00750895409108C006A0FF09013D +:10A4A000A1010903150026FF0075089540810809E0 +:10A4B00004150026FF00750895409108C0050F3966 +:10A4C00000021810050038B60834A909A0478BFD12 +:10A4D000A0768815B66500011E001C100500DF601F +:10A4E000DDD88945C74C9CD2659D9E648A9F00003B +:10A4F0000306B20077000000B17ED0C0C17ED0C09C +:10A50000D17ED0C0E17ED0C0F17ED0C0017FD0C06E +:10A51000117FD0C0217FD0C012034D0053004600F0 +:10A5200054003100300030007700280000000001A6 +:10A5300004000100000000000000020157494E55D0 +:10A540005342000000000000000000000000000076 +:10A5500000009200000000010500010088000000DA +:10A56000070000002A0044006500760069006300CF +:10A57000650049006E0074006500720066006100AD +:10A580006300650047005500490044007300000067 +:10A59000500000007B0031003300640036003300BF +:10A5A0003400300030002D00320043003900370005 +:10A5B0002D0030003000300034002D00300030001D +:10A5C000300030002D0034006300360035003600C6 +:10A5D00034003600370036003500370032007D0089 +:10A5E000000000000A00000000000306B20008009E +:10A5F00001000000A800080002000200A0001400F2 +:10A60000030057494E55534200000000000000006F +:10A6100000008400040007002A0044006500760062 +:10A6200069006300650049006E00740065007200F7 +:10A630006600610063006500470055004900440062 +:10A640007300000050007B004300450038003000DC +:10A6500039003200360034002D0034004200320050 +:10A6600034002D0034004500380031002D00410039 +:10A670003800420032002D0035003700450044000C +:10A680003000310044003500380030004500310012 +:10A690007D000000000000005D7CD0C08F7CD0C039 +:10A6A000C57BD0C00000000000000000B57DD0C018 +:10A6B000CD7DD0C0000000000000000000000000C0 +:10A6C0007D80D0C07D80D0C07D80D0C08D80D0C046 +:10A6D0003D7DD0C08F7CD0C0C57BD0C000000000C5 +:10A6E00000000000717DD0C0897DD0C00000000056 +:10A6F00000000000000000007D80D0C07D80D0C040 +:10A700007D80D0C08D80D0C0197ED0C0457ED0C0A5 +:10A71000497ED0C000000000000000004D7ED0C087 +:10A72000657ED0C0000000000000000000000000B6 +:10A730007D80D0C07D80D0C07D80D0C08D80D0C0D5 +:10A740001201100200000040972C010001020102DA +:10A750000301040309040E034C0065006400670054 +:10A76000650072000E034E0061006E006F00200055 +:10A7700053000A033000300030003100090260004D +:10A78000030102C032090400000203000002092193 +:10A790001101000122220007058203400001070584 +:10A7A0000203400001090401000203010102092122 +:10A7B0001101210122220007058103400001070544 +:10A7C00001034000010904020002FFFFFF02070528 +:10A7D0008303400001070503034000010A0600024D +:10A7E00000000040010000000300000000008000A5 +:10A7F000200000000100000000000000FFFFFF003B +:10A800000000000000000000050102000C00040030 +:10A810000700000000000000FFFFFF000000000034 +:10A82000000000002899D0C005027A000C00040046 +:10A830000700000000000000FFFFFF000000000014 +:10A84000000000004899D0C0071000000C008000F4 +:10A850002000000000000000FFFFFF0000000000DB +:10A860000880000000000000071100001A008000AE +:10A870002000000000000000FFFFFF0000000000BB +:10A8800008800000000000000300000000008000BD +:10A89000200000000100000000000000FFFFFF009A +:10A8A0000000000000000000050100000E0007008D +:10A8B0000400000000000000FFFFFF000000000097 +:10A8C000000000006899D0C0050278000E00070063 +:10A8D0000400000000000000FFFFFF000000000077 +:10A8E00000000000D098D0C00711000003008000D5 +:10A8F0002000000000000000FFFFFF00000000003B +:10A900000A80000000000000071200001300800011 +:10A910002000000000000000FFFFFF00000000001A +:10A9200008800000000000000713000023008000E2 +:10A930002000000000000000FFFFFF0000000000FA +:10A940000A800000000000002573202825642F25C0 +:10A9500064290025642F256400252E2A7300000039 +:10A960000300000000008000200000000100000043 +:10A9700000000000FFFFFF000000000000000000DA +:10A98000050102000C0004000700000000000000A8 +:10A99000FFFFFF0000000000000000002899D0C069 +:10A9A00005027A000C00040007000000000000000F +:10A9B000FFFFFF0000000000000000004899D0C029 +:10A9C0000510380002001000100000000000000018 +:10A9D000FFFFFF00000000000A80000000000000F0 +:10A9E000071100001C008000200000000000000093 +:10A9F000FFFFFF00000000000880000000000000D2 +:10AA000003000000000080002000000001000000A2 +:10AA100000000000FFFFFF00000000000000000039 +:10AA2000050102000C000400070000000000000007 +:10AA3000FFFFFF0000000000000000002899D0C0C8 +:10AA400005027A000C00040007000000000000006E +:10AA5000FFFFFF0000000000000000004899D0C088 +:10AA6000050F10000800100010000000000000009A +:10AA7000FFFFFF00000000000000000000000000D9 +:10AA8000071029000C0080002000000000000000DA +:10AA9000FFFFFF00000000000800000000000000B1 +:10AAA000071129001A0080002000000000000000AB +:10AAB000FFFFFF0000000000080000000000000091 +:10AAC0007D8CD0C0001E00200000000000000000AF +:10AAD000C0AAD0C0FFFFFFFF000000000000000080 +:10AAE0000000000000000000000000000000000066 +:10AAF0000000000000000000000000000000000056 +:10AB00000000000000000000000000000000000045 +:10AB10000000000000000000000000000000000035 +:10AB20000000000000000000000000000000000025 +:10AB30000000000000000000000000000000000015 +:04000005C0D0000166 +:00000001FF diff --git a/src/qt/res/ledger/nanos_delete.txt b/src/qt/res/ledger/nanos_delete.txt new file mode 100644 index 0000000000..198238493d --- /dev/null +++ b/src/qt/res/ledger/nanos_delete.txt @@ -0,0 +1 @@ +python3 -m ledgerblue.deleteApp --targetId 0x31100004 --appName Qtum --rootPrivateKey fea057826208738ba33ff0e1ebb8ebf682ab73753afb2d988df03b1b59187d58 diff --git a/src/qt/res/ledger/nanos_load.txt b/src/qt/res/ledger/nanos_load.txt new file mode 100644 index 0000000000..68c4565f96 --- /dev/null +++ b/src/qt/res/ledger/nanos_load.txt @@ -0,0 +1 @@ +python3 -m ledgerblue.loadApp --curve secp256k1 --tlv --targetId 0x31100004 --targetVersion="1.6.1" --delete --fileName :/ledger/nanos_app --appName "Qtum" --appVersion 1.5.3 --dataSize 64 --icon 010000000000ffffffffffffffffff1ffc0ff847f1a7f247f1a7f247f10ff01fe0fff7ffffffffffff --rootPrivateKey fea057826208738ba33ff0e1ebb8ebf682ab73753afb2d988df03b1b59187d58 --path "" --path "44'/88'" --path "45'/88'" --path "48'/88'" --path "49'/88'" --path "84'/88'" --path "0'/45342'" --path "20698'/3053'/12648430'" --appFlags 0xa50 From 41ed606fec5047185857f8b93d59c90bac1393ba Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 18 Jan 2021 14:03:37 +0100 Subject: [PATCH 045/164] Add methods for getting load and delete command --- src/qt/qtumhwitool.cpp | 66 ++++++++++++++++++++++++++++++++++++++++++ src/qt/qtumhwitool.h | 46 +++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+) diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 55e0a40526..bc39776b23 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -17,6 +17,8 @@ #include #include #include +#include +#include #include @@ -25,6 +27,8 @@ static const QString PARAM_STOP_HEIGHT = "stop_height"; static const QString PARAM_REQUESTS = "requests"; static const QString PARAM_PSBT = "psbt"; static const QString PARAM_HEXTX = "hextx"; +static const QString LOAD_FORMAT = ":/ledger/%1_load"; +static const QString DELETE_FORMAT = ":/ledger/%1_delete"; class QtumHwiToolPriv { @@ -445,3 +449,65 @@ void QtumHwiTool::addError(const QString &error) d->strError += "\n"; d->strError += error; } + +InstallDevice::InstallDevice(InstallDevice::DeviceType _type): + type(_type) +{} + +QString InstallDevice::deviceToString(InstallDevice::DeviceType type) +{ + switch (type) { + case InstallDevice::NanoS: + return "nanos"; + default: + break; + } + + return ""; +} + +bool InstallDevice::loadCommand(QString &program, QStringList &arguments) +{ + // Get the command + QString command; + QFile file(LOAD_FORMAT.arg(deviceToString(type))); + if(file.open(QIODevice::ReadOnly)) + { + command = file.readAll(); + } + + // Split to params + arguments.clear(); + arguments = command.split(" "); + bool ret = arguments.count() > 1; + if(ret) + { + program = arguments[0]; + arguments.removeAt(0); + } + + return ret; +} + +bool InstallDevice::deleteCommand(QString &program, QStringList &arguments) +{ + // Get the command + QString command; + QFile file(DELETE_FORMAT.arg(deviceToString(type))); + if(file.open(QIODevice::ReadOnly)) + { + command = file.readAll(); + } + + // Split to params + arguments.clear(); + arguments = command.split(" "); + bool ret = arguments.count() > 1; + if(ret) + { + program = arguments[0]; + arguments.removeAt(0); + } + + return ret; +} diff --git a/src/qt/qtumhwitool.h b/src/qt/qtumhwitool.h index 909208e9e6..064b7259d1 100644 --- a/src/qt/qtumhwitool.h +++ b/src/qt/qtumhwitool.h @@ -47,6 +47,52 @@ class HWDevice QString code; }; +/** + * @brief The InstallDevice class Install Qtum app to device + */ +class InstallDevice +{ +public: + /** + * @brief The DeviceType enum Supported device type to install + */ + enum DeviceType + { + NanoS + }; + + /** + * @brief InstallDevice Constructor + */ + InstallDevice(InstallDevice::DeviceType type); + + /** + * @brief deviceToString Device type to string + * @param type Device type + * @return String result + */ + static QString deviceToString(InstallDevice::DeviceType type); + + /** + * @brief loadCommand Get the load command + * @param program Program to start + * @param arguments Program arguments + * @return Success of the operation + */ + bool loadCommand(QString &program, QStringList &arguments); + + /** + * @brief deleteCommand Get the delete command + * @param program Program to start + * @param arguments Program arguments + * @return Success of the operation + */ + bool deleteCommand(QString &program, QStringList &arguments); + +private: + DeviceType type = NanoS; +}; + /** * @brief The QtumHwiTool class Communicate with the Qtum Hardware Wallet Interface Tool */ From 85edac04ca9fd7adb8b959770cf6677fc0827487 Mon Sep 17 00:00:00 2001 From: Toni Markov Date: Mon, 18 Jan 2021 14:18:53 +0100 Subject: [PATCH 046/164] Add gui for load and delete qtum app on ledger --- src/Makefile.qt.include | 4 + src/qt/forms/qtumledgerinstallerdialog.ui | 141 ++++++++++++++++++++++ src/qt/qtumledgerinstallerdialog.cpp | 31 +++++ src/qt/qtumledgerinstallerdialog.h | 32 +++++ 4 files changed, 208 insertions(+) create mode 100644 src/qt/forms/qtumledgerinstallerdialog.ui create mode 100644 src/qt/qtumledgerinstallerdialog.cpp create mode 100644 src/qt/qtumledgerinstallerdialog.h diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index f8c770e390..6f2f2751a8 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -37,6 +37,7 @@ QT_FORMS_UI = \ qt/forms/optionsdialog.ui \ qt/forms/overviewpage.ui \ qt/forms/qrctoken.ui \ + qt/forms/qtumledgerinstallerdialog.ui \ qt/forms/receivecoinsdialog.ui \ qt/forms/receiverequestdialog.ui \ qt/forms/receivetokenpage.ui \ @@ -115,6 +116,7 @@ QT_MOC_CPP = \ qt/moc_paymentserver.cpp \ qt/moc_qrimagewidget.cpp \ qt/moc_qrctoken.cpp \ + qt/moc_qtumledgerinstallerdialog.cpp \ qt/moc_qswitchcontrol.cpp \ qt/moc_qvalidatedlineedit.cpp \ qt/moc_qvalidatedtextedit.cpp \ @@ -251,6 +253,7 @@ BITCOIN_QT_H = \ qt/platformstyle.h \ qt/qrimagewidget.h \ qt/qrctoken.h \ + qt/qtumledgerinstallerdialog.h \ qt/qswitchcontrol.h \ qt/qvalidatedlineedit.h \ qt/qvalidatedtextedit.h \ @@ -467,6 +470,7 @@ BITCOIN_QT_WALLET_CPP = \ qt/overviewpage.cpp \ qt/paymentserver.cpp \ qt/qrctoken.cpp \ + qt/qtumledgerinstallerdialog.cpp \ qt/qrimagewidget.cpp \ qt/receivecoinsdialog.cpp \ qt/receiverequestdialog.cpp \ diff --git a/src/qt/forms/qtumledgerinstallerdialog.ui b/src/qt/forms/qtumledgerinstallerdialog.ui new file mode 100644 index 0000000000..4bcb77143a --- /dev/null +++ b/src/qt/forms/qtumledgerinstallerdialog.ui @@ -0,0 +1,141 @@ + + + QtumLedgerInstallerDialog + + + + 0 + 0 + 662 + 338 + + + + Qtum app ledger installer + + + + 0 + + + 0 + + + 0 + + + + + 12 + + + 30 + + + 30 + + + + + + 75 + true + + + + Install or remove QTUM app from ledger. + + + + + + + 10 + + + + + + 0 + 0 + + + + Select ledger type: + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 30 + + + 15 + + + 30 + + + + + Install + + + + + + + Remove + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Cancel + + + + + + + + + + + diff --git a/src/qt/qtumledgerinstallerdialog.cpp b/src/qt/qtumledgerinstallerdialog.cpp new file mode 100644 index 0000000000..325e8abf51 --- /dev/null +++ b/src/qt/qtumledgerinstallerdialog.cpp @@ -0,0 +1,31 @@ +#include "qt/qtumledgerinstallerdialog.h" +#include "qt/forms/ui_qtumledgerinstallerdialog.h" + +QtumLedgerInstallerDialog::QtumLedgerInstallerDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::QtumLedgerInstallerDialog) +{ + ui->setupUi(this); + + ui->cbLedgerType->addItem(tr("Ledger Nano S"), NanoS); +} + +QtumLedgerInstallerDialog::~QtumLedgerInstallerDialog() +{ + delete ui; +} + +void QtumLedgerInstallerDialog::on_addButton_clicked() +{ + +} + +void QtumLedgerInstallerDialog::on_removeButton_clicked() +{ + +} + +void QtumLedgerInstallerDialog::on_cancelButton_clicked() +{ + QDialog::reject(); +} diff --git a/src/qt/qtumledgerinstallerdialog.h b/src/qt/qtumledgerinstallerdialog.h new file mode 100644 index 0000000000..9c8623ef69 --- /dev/null +++ b/src/qt/qtumledgerinstallerdialog.h @@ -0,0 +1,32 @@ +#ifndef QTUMLEDGERINSTALLERDIALOG_H +#define QTUMLEDGERINSTALLERDIALOG_H + +#include + +namespace Ui { +class QtumLedgerInstallerDialog; +} + +class QtumLedgerInstallerDialog : public QDialog +{ + Q_OBJECT + +public: + explicit QtumLedgerInstallerDialog(QWidget *parent = nullptr); + ~QtumLedgerInstallerDialog(); + + enum LedgerType + { + NanoS + }; + +private Q_SLOTS: + void on_addButton_clicked(); + void on_removeButton_clicked(); + void on_cancelButton_clicked(); + +private: + Ui::QtumLedgerInstallerDialog *ui; +}; + +#endif // QTUMLEDGERINSTALLERDIALOG_H From 5d2719e0ee7909e1b7743e580b417879d4a5650f Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 18 Jan 2021 15:21:31 +0100 Subject: [PATCH 047/164] Add install and remove methods for app --- src/qt/qtumhwitool.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ src/qt/qtumhwitool.h | 14 ++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index bc39776b23..c97845e9e7 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -511,3 +511,43 @@ bool InstallDevice::deleteCommand(QString &program, QStringList &arguments) return ret; } + +bool QtumHwiTool::installApp(InstallDevice::DeviceType type) +{ + // Install Qtum App to ledger + InstallDevice device(type); + QString program; + QStringList arguments; + bool ret = device.loadCommand(program, arguments); + if(ret) + { + d->process.start(program, arguments); + d->fStarted = true; + + wait(); + + ret &= QProcess::NormalExit == d->process.exitStatus(); + } + + return ret; +} + +bool QtumHwiTool::removeApp(InstallDevice::DeviceType type) +{ + // Remove Qtum App from ledger + InstallDevice device(type); + QString program; + QStringList arguments; + bool ret = device.deleteCommand(program, arguments); + if(ret) + { + d->process.start(program, arguments); + d->fStarted = true; + + wait(); + + ret &= QProcess::NormalExit == d->process.exitStatus(); + } + + return ret; +} diff --git a/src/qt/qtumhwitool.h b/src/qt/qtumhwitool.h index 064b7259d1..0ab92ef7e1 100644 --- a/src/qt/qtumhwitool.h +++ b/src/qt/qtumhwitool.h @@ -205,6 +205,20 @@ class QtumHwiTool : public QObject */ bool decodePsbt(const QString& psbt, QString& decoded); + /** + * @brief installApp Install Qtum App to ledger + * @param type Ledger device type + * @return success of the operation + */ + bool installApp(InstallDevice::DeviceType type); + + /** + * @brief removeApp Remove Qtum App to ledger + * @param type Ledger device type + * @return success of the operation + */ + bool removeApp(InstallDevice::DeviceType type); + /** * @brief errorMessage Get the last error message * @return Last error message From 198781508ebea216bf6102bf9dce33f1f0f6d2d0 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Wed, 20 Jan 2021 10:47:40 +0100 Subject: [PATCH 048/164] Add setup ledger action --- src/qt/bitcoingui.cpp | 9 +++++++ src/qt/bitcoingui.h | 3 +++ src/qt/qtumledgerinstallerdialog.cpp | 40 ++++++++++++++++++++++++---- src/qt/qtumledgerinstallerdialog.h | 12 +++++---- src/qt/walletframe.cpp | 7 +++++ src/qt/walletframe.h | 2 ++ src/qt/walletview.cpp | 7 +++++ src/qt/walletview.h | 2 ++ 8 files changed, 72 insertions(+), 10 deletions(-) diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index c17d99985c..1cc5069907 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -413,6 +413,8 @@ void BitcoinGUI::createActions() verifyMessageAction->setStatusTip(tr("Verify messages to ensure they were signed with specified Qtum addresses")); signTxHardwareAction = new QAction(tr("Sign with &hardware..."), this); signTxHardwareAction->setStatusTip(tr("Sign transaction with hardware wallet")); + setupLedgerAction = new QAction(tr("Setup &ledger..."), this); + setupLedgerAction->setStatusTip(tr("Setup ledger hardware wallet application")); openRPCConsoleAction = new QAction(tr("Node window"), this); openRPCConsoleAction->setStatusTip(tr("Open node debugging and diagnostic console")); @@ -470,6 +472,7 @@ void BitcoinGUI::createActions() connect(usedSendingAddressesAction, &QAction::triggered, walletFrame, &WalletFrame::usedSendingAddresses); connect(usedReceivingAddressesAction, &QAction::triggered, walletFrame, &WalletFrame::usedReceivingAddresses); connect(signTxHardwareAction, &QAction::triggered, [this]{ signTxHardware(); }); + connect(setupLedgerAction, &QAction::triggered, [this]{ setupLedger(); }); connect(openAction, &QAction::triggered, this, &BitcoinGUI::openClicked); connect(m_open_wallet_menu, &QMenu::aboutToShow, [this] { m_open_wallet_menu->clear(); @@ -542,6 +545,7 @@ void BitcoinGUI::createMenuBar() if(::Params().HasHardwareWalletSupport()) { file->addAction(signTxHardwareAction); + file->addAction(setupLedgerAction); } file->addSeparator(); } @@ -859,6 +863,7 @@ void BitcoinGUI::setWalletActionsEnabled(bool enabled) superStakerAction->setEnabled(enabled); walletStakeAction->setEnabled(enabled); signTxHardwareAction->setEnabled(enabled); + setupLedgerAction->setEnabled(enabled); m_close_wallet_action->setEnabled(enabled); } @@ -1047,6 +1052,10 @@ void BitcoinGUI::signTxHardware(const QString& tx) { if (walletFrame) walletFrame->signTxHardware(tx); } +void BitcoinGUI::setupLedger() +{ + if (walletFrame) walletFrame->setupLedger(); +} #endif // ENABLE_WALLET void BitcoinGUI::updateNetworkState() diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h index af9734d568..98c02f1b0b 100644 --- a/src/qt/bitcoingui.h +++ b/src/qt/bitcoingui.h @@ -172,6 +172,7 @@ class BitcoinGUI : public QMainWindow QAction* superStakerAction = nullptr; QAction* walletStakeAction = nullptr; QAction* signTxHardwareAction = nullptr; + QAction* setupLedgerAction = nullptr; QAction* m_create_wallet_action{nullptr}; QAction* m_open_wallet_action{nullptr}; QMenu* m_open_wallet_menu{nullptr}; @@ -321,6 +322,8 @@ public Q_SLOTS: void gotoVerifyMessageTab(QString addr = ""); /** Sign transaction with hardware wallet*/ void signTxHardware(const QString& tx = ""); + /** Setup ledger hardware wallet application*/ + void setupLedger(); /** Show open dialog */ void openClicked(); diff --git a/src/qt/qtumledgerinstallerdialog.cpp b/src/qt/qtumledgerinstallerdialog.cpp index 325e8abf51..3c37b33e91 100644 --- a/src/qt/qtumledgerinstallerdialog.cpp +++ b/src/qt/qtumledgerinstallerdialog.cpp @@ -1,31 +1,61 @@ -#include "qt/qtumledgerinstallerdialog.h" -#include "qt/forms/ui_qtumledgerinstallerdialog.h" +#include +#include + +#include + +class QtumLedgerInstallerDialogPriv +{ +public: + QtumLedgerInstallerDialogPriv(QObject *parent) + { + tool = new QtumHwiTool(parent); + } + + QtumHwiTool* tool = 0; +}; QtumLedgerInstallerDialog::QtumLedgerInstallerDialog(QWidget *parent) : QDialog(parent), ui(new Ui::QtumLedgerInstallerDialog) { ui->setupUi(this); + d = new QtumLedgerInstallerDialogPriv(this); - ui->cbLedgerType->addItem(tr("Ledger Nano S"), NanoS); + ui->cbLedgerType->addItem(tr("Ledger Nano S"), InstallDevice::NanoS); } QtumLedgerInstallerDialog::~QtumLedgerInstallerDialog() { delete ui; + delete d; } void QtumLedgerInstallerDialog::on_addButton_clicked() { - + d->tool->installApp(getDeviceType()); + QDialog::accept(); } void QtumLedgerInstallerDialog::on_removeButton_clicked() { - + d->tool->removeApp(getDeviceType()); + QDialog::accept(); } void QtumLedgerInstallerDialog::on_cancelButton_clicked() { QDialog::reject(); } + +InstallDevice::DeviceType QtumLedgerInstallerDialog::getDeviceType() +{ + int deviceType = ui->cbLedgerType->currentData().toInt(); + switch (deviceType) { + case InstallDevice::NanoS: + return InstallDevice::NanoS; + default: + break; + } + + return InstallDevice::NanoS; +} diff --git a/src/qt/qtumledgerinstallerdialog.h b/src/qt/qtumledgerinstallerdialog.h index 9c8623ef69..0762d94d43 100644 --- a/src/qt/qtumledgerinstallerdialog.h +++ b/src/qt/qtumledgerinstallerdialog.h @@ -2,6 +2,9 @@ #define QTUMLEDGERINSTALLERDIALOG_H #include +#include + +class QtumLedgerInstallerDialogPriv; namespace Ui { class QtumLedgerInstallerDialog; @@ -15,18 +18,17 @@ class QtumLedgerInstallerDialog : public QDialog explicit QtumLedgerInstallerDialog(QWidget *parent = nullptr); ~QtumLedgerInstallerDialog(); - enum LedgerType - { - NanoS - }; - private Q_SLOTS: void on_addButton_clicked(); void on_removeButton_clicked(); void on_cancelButton_clicked(); +protected: + InstallDevice::DeviceType getDeviceType(); + private: Ui::QtumLedgerInstallerDialog *ui; + QtumLedgerInstallerDialogPriv *d; }; #endif // QTUMLEDGERINSTALLERDIALOG_H diff --git a/src/qt/walletframe.cpp b/src/qt/walletframe.cpp index db84d775eb..974829fa92 100644 --- a/src/qt/walletframe.cpp +++ b/src/qt/walletframe.cpp @@ -335,3 +335,10 @@ void WalletFrame::signTxHardware(const QString& tx) if (walletView) walletView->signTxHardware(tx); } + +void WalletFrame::setupLedger() +{ + WalletView *walletView = currentWalletView(); + if (walletView) + walletView->setupLedger(); +} diff --git a/src/qt/walletframe.h b/src/qt/walletframe.h index 54096e642c..abcb2a74cb 100644 --- a/src/qt/walletframe.h +++ b/src/qt/walletframe.h @@ -107,6 +107,8 @@ public Q_SLOTS: void lockWallet(); /** Sign transaction with hardware wallet*/ void signTxHardware(const QString& tx = ""); + /** Setup ledger hardware wallet application*/ + void setupLedger(); /** Show used sending addresses */ void usedSendingAddresses(); diff --git a/src/qt/walletview.cpp b/src/qt/walletview.cpp index f2f092674e..527d30651d 100644 --- a/src/qt/walletview.cpp +++ b/src/qt/walletview.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -470,3 +471,9 @@ void WalletView::signTxHardware(const QString &tx) dlg.setModel(walletModel); dlg.exec(); } + +void WalletView::setupLedger() +{ + QtumLedgerInstallerDialog dlg(this); + dlg.exec(); +} diff --git a/src/qt/walletview.h b/src/qt/walletview.h index 00aaa37d28..9d31ca7025 100644 --- a/src/qt/walletview.h +++ b/src/qt/walletview.h @@ -140,6 +140,8 @@ public Q_SLOTS: void lockWallet(); /** Sign transaction with hardware wallet*/ void signTxHardware(const QString& tx = ""); + /** Setup ledger hardware wallet application*/ + void setupLedger(); /** Show used sending addresses */ void usedSendingAddresses(); From 45556968473d4b031946f7d4e9ef26947a7c0e74 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Wed, 20 Jan 2021 12:37:33 +0100 Subject: [PATCH 049/164] Display error message box in case of ledger app install problem --- src/qt/bitcoin.qrc | 4 ++-- src/qt/qtumhwitool.cpp | 2 ++ src/qt/qtumledgerinstallerdialog.cpp | 11 +++++++++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/qt/bitcoin.qrc b/src/qt/bitcoin.qrc index d6f19a4313..0a7c3aa909 100644 --- a/src/qt/bitcoin.qrc +++ b/src/qt/bitcoin.qrc @@ -242,7 +242,7 @@ res/ledger/nanos_app.hex - res/ledger/nanos_load.txt - res/ledger/nanos_delete.txt + res/ledger/nanos_load.txt + res/ledger/nanos_delete.txt diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index c97845e9e7..13f620ea5f 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -527,6 +527,7 @@ bool QtumHwiTool::installApp(InstallDevice::DeviceType type) wait(); ret &= QProcess::NormalExit == d->process.exitStatus(); + ret &= d->strError.isEmpty(); } return ret; @@ -547,6 +548,7 @@ bool QtumHwiTool::removeApp(InstallDevice::DeviceType type) wait(); ret &= QProcess::NormalExit == d->process.exitStatus(); + ret &= d->strError.isEmpty(); } return ret; diff --git a/src/qt/qtumledgerinstallerdialog.cpp b/src/qt/qtumledgerinstallerdialog.cpp index 3c37b33e91..89ba702072 100644 --- a/src/qt/qtumledgerinstallerdialog.cpp +++ b/src/qt/qtumledgerinstallerdialog.cpp @@ -2,6 +2,7 @@ #include #include +#include class QtumLedgerInstallerDialogPriv { @@ -32,13 +33,19 @@ QtumLedgerInstallerDialog::~QtumLedgerInstallerDialog() void QtumLedgerInstallerDialog::on_addButton_clicked() { - d->tool->installApp(getDeviceType()); + if(!d->tool->installApp(getDeviceType())) + { + QMessageBox::warning(this, tr("Install problem"), d->tool->errorMessage()); + } QDialog::accept(); } void QtumLedgerInstallerDialog::on_removeButton_clicked() { - d->tool->removeApp(getDeviceType()); + if(!d->tool->removeApp(getDeviceType())) + { + QMessageBox::warning(this, tr("Remove problem"), d->tool->errorMessage()); + } QDialog::accept(); } From 865fe96025ade2e46f5b39a9c3aa7382da976812 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Wed, 20 Jan 2021 13:32:23 +0100 Subject: [PATCH 050/164] Trim load and delete commands --- src/qt/qtumhwitool.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 13f620ea5f..02eba06721 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -473,7 +473,7 @@ bool InstallDevice::loadCommand(QString &program, QStringList &arguments) QFile file(LOAD_FORMAT.arg(deviceToString(type))); if(file.open(QIODevice::ReadOnly)) { - command = file.readAll(); + command = file.readAll().trimmed(); } // Split to params @@ -496,7 +496,7 @@ bool InstallDevice::deleteCommand(QString &program, QStringList &arguments) QFile file(DELETE_FORMAT.arg(deviceToString(type))); if(file.open(QIODevice::ReadOnly)) { - command = file.readAll(); + command = file.readAll().trimmed(); } // Split to params From 23e7cf429349762a8c6372b999cc3771cbfc5834 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Wed, 20 Jan 2021 14:42:33 +0100 Subject: [PATCH 051/164] Remove extra quotes in command line --- src/qt/qtumhwitool.cpp | 12 ++++++++++-- src/qt/res/ledger/nanos_load.txt | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 02eba06721..5a02dd6b8a 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -478,7 +478,11 @@ bool InstallDevice::loadCommand(QString &program, QStringList &arguments) // Split to params arguments.clear(); - arguments = command.split(" "); + QStringList args = command.split(" "); + for(QString arg: args) + { + arguments.push_back(arg.remove("\"")); + } bool ret = arguments.count() > 1; if(ret) { @@ -501,7 +505,11 @@ bool InstallDevice::deleteCommand(QString &program, QStringList &arguments) // Split to params arguments.clear(); - arguments = command.split(" "); + QStringList args = command.split(" "); + for(QString arg: args) + { + arguments.push_back(arg.remove("\"")); + } bool ret = arguments.count() > 1; if(ret) { diff --git a/src/qt/res/ledger/nanos_load.txt b/src/qt/res/ledger/nanos_load.txt index 68c4565f96..d3496c03df 100644 --- a/src/qt/res/ledger/nanos_load.txt +++ b/src/qt/res/ledger/nanos_load.txt @@ -1 +1 @@ -python3 -m ledgerblue.loadApp --curve secp256k1 --tlv --targetId 0x31100004 --targetVersion="1.6.1" --delete --fileName :/ledger/nanos_app --appName "Qtum" --appVersion 1.5.3 --dataSize 64 --icon 010000000000ffffffffffffffffff1ffc0ff847f1a7f247f1a7f247f10ff01fe0fff7ffffffffffff --rootPrivateKey fea057826208738ba33ff0e1ebb8ebf682ab73753afb2d988df03b1b59187d58 --path "" --path "44'/88'" --path "45'/88'" --path "48'/88'" --path "49'/88'" --path "84'/88'" --path "0'/45342'" --path "20698'/3053'/12648430'" --appFlags 0xa50 +python3 -m ledgerblue.loadApp --curve secp256k1 --tlv --targetId 0x31100004 --targetVersion="1.6.1" --delete --fileName :/ledger/nanos_app --appName "Qtum" --appVersion 1.5.3 --dataSize 64 --icon 010000000000ffffffffffffffffff1ffc0ff847f1a7f247f1a7f247f10ff01fe0fff7ffffffffffff --rootPrivateKey fea057826208738ba33ff0e1ebb8ebf682ab73753afb2d988df03b1b59187d58 --path "" --path "44'/88'" --path "45'/88'" --path "48'/88'" --path "49'/88'" --path "84'/88'" --path "0'/45342'" --path "20698'/3053'/12648430'" --appFlags 0xa50 From a88c12ebc20a74d0bbfa390190b0e6c90f1ec6f3 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 21 Jan 2021 10:04:14 +0100 Subject: [PATCH 052/164] Update install device --- src/qt/qtumhwitool.cpp | 63 +++++++++++++++++++++++------------------- src/qt/qtumhwitool.h | 14 ++++++++-- 2 files changed, 47 insertions(+), 30 deletions(-) diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 5a02dd6b8a..2b653b37b3 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -450,9 +450,22 @@ void QtumHwiTool::addError(const QString &error) d->strError += error; } -InstallDevice::InstallDevice(InstallDevice::DeviceType _type): - type(_type) -{} +class InstallDevicePriv +{ +public: + InstallDevice::DeviceType type = InstallDevice::NanoS; +}; + +InstallDevice::InstallDevice(InstallDevice::DeviceType type) +{ + d = new InstallDevicePriv(); + d->type = type; +} + +InstallDevice::~InstallDevice() +{ + delete d; +} QString InstallDevice::deviceToString(InstallDevice::DeviceType type) { @@ -468,47 +481,36 @@ QString InstallDevice::deviceToString(InstallDevice::DeviceType type) bool InstallDevice::loadCommand(QString &program, QStringList &arguments) { - // Get the command - QString command; - QFile file(LOAD_FORMAT.arg(deviceToString(type))); - if(file.open(QIODevice::ReadOnly)) - { - command = file.readAll().trimmed(); - } - - // Split to params - arguments.clear(); - QStringList args = command.split(" "); - for(QString arg: args) - { - arguments.push_back(arg.remove("\"")); - } - bool ret = arguments.count() > 1; - if(ret) - { - program = arguments[0]; - arguments.removeAt(0); - } - - return ret; + QString rcPath = LOAD_FORMAT.arg(deviceToString(d->type)); + return getRCCommand(rcPath, program, arguments); } bool InstallDevice::deleteCommand(QString &program, QStringList &arguments) +{ + QString rcPath = DELETE_FORMAT.arg(deviceToString(d->type)); + return getRCCommand(rcPath, program, arguments); +} + +bool InstallDevice::getRCCommand(const QString &rcPath, QString &program, QStringList &arguments) { // Get the command QString command; - QFile file(DELETE_FORMAT.arg(deviceToString(type))); + QFile file(rcPath); if(file.open(QIODevice::ReadOnly)) { command = file.readAll().trimmed(); } + else + { + return false; + } // Split to params arguments.clear(); QStringList args = command.split(" "); for(QString arg: args) { - arguments.push_back(arg.remove("\"")); + arguments.push_back(parse(arg)); } bool ret = arguments.count() > 1; if(ret) @@ -520,6 +522,11 @@ bool InstallDevice::deleteCommand(QString &program, QStringList &arguments) return ret; } +QString InstallDevice::parse(QString arg) +{ + return arg.remove("\""); +} + bool QtumHwiTool::installApp(InstallDevice::DeviceType type) { // Install Qtum App to ledger diff --git a/src/qt/qtumhwitool.h b/src/qt/qtumhwitool.h index 0ab92ef7e1..871155f718 100644 --- a/src/qt/qtumhwitool.h +++ b/src/qt/qtumhwitool.h @@ -5,6 +5,7 @@ #include #include class QtumHwiToolPriv; +class InstallDevicePriv; class WalletModel; class ExecRPCCommand; @@ -64,7 +65,12 @@ class InstallDevice /** * @brief InstallDevice Constructor */ - InstallDevice(InstallDevice::DeviceType type); + InstallDevice(InstallDevice::DeviceType type = InstallDevice::NanoS); + + /** + * @brief ~InstallDevice Destructor + */ + ~InstallDevice(); /** * @brief deviceToString Device type to string @@ -90,7 +96,11 @@ class InstallDevice bool deleteCommand(QString &program, QStringList &arguments); private: - DeviceType type = NanoS; + bool getRCCommand(const QString &rcPath, QString &program, QStringList &arguments); + QString parse(QString arg); + +private: + InstallDevicePriv *d; }; /** From d93e16ffc1ce6968175997bf1bdbf1a13d3eb76d Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 21 Jan 2021 11:39:13 +0100 Subject: [PATCH 053/164] Write the resource to disk so the load tool can use it --- src/qt/qtumhwitool.cpp | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 2b653b37b3..8f0c28f00f 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -29,6 +29,7 @@ static const QString PARAM_PSBT = "psbt"; static const QString PARAM_HEXTX = "hextx"; static const QString LOAD_FORMAT = ":/ledger/%1_load"; static const QString DELETE_FORMAT = ":/ledger/%1_delete"; +static const QString RC_PATH_FORMAT = ":/ledger"; class QtumHwiToolPriv { @@ -453,7 +454,16 @@ void QtumHwiTool::addError(const QString &error) class InstallDevicePriv { public: + ~InstallDevicePriv() + { + for(QString path : filePaths) + { + QFile::remove(path); + } + } + InstallDevice::DeviceType type = InstallDevice::NanoS; + QStringList filePaths; }; InstallDevice::InstallDevice(InstallDevice::DeviceType type) @@ -524,7 +534,25 @@ bool InstallDevice::getRCCommand(const QString &rcPath, QString &program, QStrin QString InstallDevice::parse(QString arg) { - return arg.remove("\""); + arg = arg.remove("\""); + if(arg.startsWith(RC_PATH_FORMAT)) + { + QString dataDir = QString::fromStdString(GetDataDir().string()); + QFile fileIn(arg); + if(fileIn.open(QIODevice::ReadOnly)) + { + QByteArray data = fileIn.readAll(); + arg = arg.replace(RC_PATH_FORMAT, dataDir); + arg += ".hex"; + QFile fileOut(arg); + if(fileOut.open(QIODevice::WriteOnly)) + { + fileOut.write(data); + } + d->filePaths << arg; + } + } + return arg; } bool QtumHwiTool::installApp(InstallDevice::DeviceType type) From 26d8b58712b08f19a082946b32310acd58278ece Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 21 Jan 2021 14:07:08 +0100 Subject: [PATCH 054/164] Add fail to start message --- src/qt/qtumhwitool.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 8f0c28f00f..403a370a8d 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -186,13 +186,19 @@ void QtumHwiTool::wait() { if(d->fStarted) { + bool wasStarted = false; if(d->process.waitForStarted()) { + wasStarted = true; d->process.waitForFinished(-1); } d->strStdout = d->process.readAllStandardOutput(); d->strError = d->process.readAllStandardError(); d->fStarted = false; + if(!wasStarted && d->strError.isEmpty()) + { + d->strError = tr("Application %1 fail to start.").arg(d->process.program()); + } } } From eab73d4b5d8a7f7ad3784aa49a0ef7482ffea100 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 22 Jan 2021 10:20:38 +0100 Subject: [PATCH 055/164] Change ledger action name --- src/qt/bitcoingui.cpp | 10 +++++----- src/qt/bitcoingui.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 1cc5069907..7ee1d20f8b 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -413,8 +413,8 @@ void BitcoinGUI::createActions() verifyMessageAction->setStatusTip(tr("Verify messages to ensure they were signed with specified Qtum addresses")); signTxHardwareAction = new QAction(tr("Sign with &hardware..."), this); signTxHardwareAction->setStatusTip(tr("Sign transaction with hardware wallet")); - setupLedgerAction = new QAction(tr("Setup &ledger..."), this); - setupLedgerAction->setStatusTip(tr("Setup ledger hardware wallet application")); + ledgerAction = new QAction(tr("Menage &ledger..."), this); + ledgerAction->setStatusTip(tr("Menage ledger hardware wallet application")); openRPCConsoleAction = new QAction(tr("Node window"), this); openRPCConsoleAction->setStatusTip(tr("Open node debugging and diagnostic console")); @@ -472,7 +472,7 @@ void BitcoinGUI::createActions() connect(usedSendingAddressesAction, &QAction::triggered, walletFrame, &WalletFrame::usedSendingAddresses); connect(usedReceivingAddressesAction, &QAction::triggered, walletFrame, &WalletFrame::usedReceivingAddresses); connect(signTxHardwareAction, &QAction::triggered, [this]{ signTxHardware(); }); - connect(setupLedgerAction, &QAction::triggered, [this]{ setupLedger(); }); + connect(ledgerAction, &QAction::triggered, [this]{ setupLedger(); }); connect(openAction, &QAction::triggered, this, &BitcoinGUI::openClicked); connect(m_open_wallet_menu, &QMenu::aboutToShow, [this] { m_open_wallet_menu->clear(); @@ -545,7 +545,7 @@ void BitcoinGUI::createMenuBar() if(::Params().HasHardwareWalletSupport()) { file->addAction(signTxHardwareAction); - file->addAction(setupLedgerAction); + file->addAction(ledgerAction); } file->addSeparator(); } @@ -863,7 +863,7 @@ void BitcoinGUI::setWalletActionsEnabled(bool enabled) superStakerAction->setEnabled(enabled); walletStakeAction->setEnabled(enabled); signTxHardwareAction->setEnabled(enabled); - setupLedgerAction->setEnabled(enabled); + ledgerAction->setEnabled(enabled); m_close_wallet_action->setEnabled(enabled); } diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h index 98c02f1b0b..525360b6ec 100644 --- a/src/qt/bitcoingui.h +++ b/src/qt/bitcoingui.h @@ -172,7 +172,7 @@ class BitcoinGUI : public QMainWindow QAction* superStakerAction = nullptr; QAction* walletStakeAction = nullptr; QAction* signTxHardwareAction = nullptr; - QAction* setupLedgerAction = nullptr; + QAction* ledgerAction = nullptr; QAction* m_create_wallet_action{nullptr}; QAction* m_open_wallet_action{nullptr}; QMenu* m_open_wallet_menu{nullptr}; From d9f09fa66e9f300d6330628a4cb928c33cb61b70 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 22 Jan 2021 10:51:42 +0100 Subject: [PATCH 056/164] Display wait message box for install and remove Qtum from ledger --- src/qt/qtumledgerinstallerdialog.cpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/qt/qtumledgerinstallerdialog.cpp b/src/qt/qtumledgerinstallerdialog.cpp index 89ba702072..8901b0d845 100644 --- a/src/qt/qtumledgerinstallerdialog.cpp +++ b/src/qt/qtumledgerinstallerdialog.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -13,6 +14,7 @@ class QtumLedgerInstallerDialogPriv } QtumHwiTool* tool = 0; + bool ret = false; }; QtumLedgerInstallerDialog::QtumLedgerInstallerDialog(QWidget *parent) : @@ -33,19 +35,35 @@ QtumLedgerInstallerDialog::~QtumLedgerInstallerDialog() void QtumLedgerInstallerDialog::on_addButton_clicked() { - if(!d->tool->installApp(getDeviceType())) + // Install Qtum app from ledger + WaitMessageBox dlg(tr("Ledger Status"), tr("Confirm Qtum install on your Ledger device..."), [this]() { + d->ret = d->tool->installApp(getDeviceType()); + }, this); + + dlg.exec(); + + if(!d->ret) { QMessageBox::warning(this, tr("Install problem"), d->tool->errorMessage()); } + QDialog::accept(); } void QtumLedgerInstallerDialog::on_removeButton_clicked() { - if(!d->tool->removeApp(getDeviceType())) + // Remove Qtum app from ledger + WaitMessageBox dlg(tr("Ledger Status"), tr("Confirm Qtum removal on your Ledger device..."), [this]() { + d->ret = d->tool->removeApp(getDeviceType()); + }, this); + + dlg.exec(); + + if(!d->ret) { QMessageBox::warning(this, tr("Remove problem"), d->tool->errorMessage()); } + QDialog::accept(); } From ed6fa6c408636196b9a259d65aa87f7a78d069cd Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 22 Jan 2021 11:17:19 +0100 Subject: [PATCH 057/164] Parse error messages for install and remove ledger --- src/qt/qtumledgerinstallerdialog.cpp | 44 +++++++++++++++++++++++----- src/qt/qtumledgerinstallerdialog.h | 1 + 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/qt/qtumledgerinstallerdialog.cpp b/src/qt/qtumledgerinstallerdialog.cpp index 8901b0d845..423e5d2c30 100644 --- a/src/qt/qtumledgerinstallerdialog.cpp +++ b/src/qt/qtumledgerinstallerdialog.cpp @@ -42,12 +42,15 @@ void QtumLedgerInstallerDialog::on_addButton_clicked() dlg.exec(); - if(!d->ret) + QString message; + if(!d->ret && parseErrorMessage(message)) { - QMessageBox::warning(this, tr("Install problem"), d->tool->errorMessage()); + QMessageBox::warning(this, tr("Install problem"), message); + } + else + { + QDialog::accept(); } - - QDialog::accept(); } void QtumLedgerInstallerDialog::on_removeButton_clicked() @@ -59,12 +62,15 @@ void QtumLedgerInstallerDialog::on_removeButton_clicked() dlg.exec(); - if(!d->ret) + QString message; + if(!d->ret && parseErrorMessage(message)) { - QMessageBox::warning(this, tr("Remove problem"), d->tool->errorMessage()); + QMessageBox::warning(this, tr("Remove problem"), message); + } + else + { + QDialog::accept(); } - - QDialog::accept(); } void QtumLedgerInstallerDialog::on_cancelButton_clicked() @@ -84,3 +90,25 @@ InstallDevice::DeviceType QtumLedgerInstallerDialog::getDeviceType() return InstallDevice::NanoS; } + +bool QtumLedgerInstallerDialog::parseErrorMessage(QString &message) +{ + QString errorMessage = d->tool->errorMessage(); + if(errorMessage.contains("denied by the user", Qt::CaseInsensitive)) + return false; + + if(errorMessage.contains("ModuleNotFoundError", Qt::CaseInsensitive) && errorMessage.contains("ledgerblue", Qt::CaseInsensitive)) + { + message = tr("Ledger loader not found, you can install it with the command:") + "\npip3 install ledgerblue"; + return true; + } + + if(errorMessage.contains("No dongle found", Qt::CaseInsensitive)) + { + message = tr("Please insert your Ledger. Verify the cable is connected and that no other application is using it."); + return true; + } + + message = d->tool->errorMessage(); + return true; +} diff --git a/src/qt/qtumledgerinstallerdialog.h b/src/qt/qtumledgerinstallerdialog.h index 0762d94d43..259cd5637f 100644 --- a/src/qt/qtumledgerinstallerdialog.h +++ b/src/qt/qtumledgerinstallerdialog.h @@ -25,6 +25,7 @@ private Q_SLOTS: protected: InstallDevice::DeviceType getDeviceType(); + bool parseErrorMessage(QString& message); private: Ui::QtumLedgerInstallerDialog *ui; From 90cffbe54f318b1d009521d956366b24750bba51 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 25 Jan 2021 09:55:16 +0100 Subject: [PATCH 058/164] Add error message for opened ledger application --- src/qt/qtumledgerinstallerdialog.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/qt/qtumledgerinstallerdialog.cpp b/src/qt/qtumledgerinstallerdialog.cpp index 423e5d2c30..10b3d0e644 100644 --- a/src/qt/qtumledgerinstallerdialog.cpp +++ b/src/qt/qtumledgerinstallerdialog.cpp @@ -109,6 +109,12 @@ bool QtumLedgerInstallerDialog::parseErrorMessage(QString &message) return true; } + if(errorMessage.contains("verify that the right application is opened", Qt::CaseInsensitive)) + { + message = tr("Please close the Qtum application on your ledger."); + return true; + } + message = d->tool->errorMessage(); return true; } From a06edea235f3a4845c8a3a4a4cfbcd3582a4e49b Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 25 Jan 2021 10:16:39 +0100 Subject: [PATCH 059/164] Update hwi tool download location --- src/qt/guiconstants.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/guiconstants.h b/src/qt/guiconstants.h index b59ab167c2..89778addf6 100644 --- a/src/qt/guiconstants.h +++ b/src/qt/guiconstants.h @@ -62,6 +62,6 @@ static constexpr int DEFAULT_PRUNE_TARGET_GB{2}; #define QTUM_INFO_TESTNET "%2" /* Hardware wallet interface uri */ -#define QTUM_HWI_TOOL "HWI Tool" +#define QTUM_HWI_TOOL "HWI Tool" #endif // BITCOIN_QT_GUICONSTANTS_H From c6d05cf2eee2b9bc5ddc8001a5ff5d9d5c1d53a0 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 25 Jan 2021 10:26:42 +0100 Subject: [PATCH 060/164] Enable hardware wallet support for mainnet and testnet --- src/chainparams.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 12ae3bcc7a..4379add03b 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -157,7 +157,7 @@ class CMainParams : public CChainParams { fMineBlocksOnDemand = false; m_is_test_chain = false; m_is_mockable_chain = false; - fHasHardwareWalletSupport = false; + fHasHardwareWalletSupport = true; checkpointData = { { @@ -287,7 +287,7 @@ class CTestNetParams : public CChainParams { fMineBlocksOnDemand = false; m_is_test_chain = true; m_is_mockable_chain = false; - fHasHardwareWalletSupport = false; + fHasHardwareWalletSupport = true; checkpointData = { { From 806357d95fbb8ebf800e1c0ae910b743cdd02347 Mon Sep 17 00:00:00 2001 From: Toni Markov Date: Thu, 4 Feb 2021 13:25:07 +0100 Subject: [PATCH 061/164] Update buttons for create unsigned --- src/qt/adddelegationpage.cpp | 5 +++++ src/qt/createcontract.cpp | 5 +++++ src/qt/removedelegationpage.cpp | 5 +++++ src/qt/sendtocontract.cpp | 5 +++++ src/qt/sendtokenpage.cpp | 5 +++++ 5 files changed, 25 insertions(+) diff --git a/src/qt/adddelegationpage.cpp b/src/qt/adddelegationpage.cpp index 4f4a7f0af8..1332f8ff94 100644 --- a/src/qt/adddelegationpage.cpp +++ b/src/qt/adddelegationpage.cpp @@ -99,6 +99,11 @@ void AddDelegationPage::setModel(WalletModel *_model) // update the display unit, to not use the default ("QTUM") updateDisplayUnit(); + + if (m_model->wallet().privateKeysDisabled()) { + ui->addDelegationButton->setText(tr("Cr&eate Unsigned")); + ui->addDelegationButton->setToolTip(tr("Creates a Partially Signed Qtum Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); + } } void AddDelegationPage::setClientModel(ClientModel *_clientModel) diff --git a/src/qt/createcontract.cpp b/src/qt/createcontract.cpp index 2c4666ad50..72e4c81368 100644 --- a/src/qt/createcontract.cpp +++ b/src/qt/createcontract.cpp @@ -116,6 +116,11 @@ void CreateContract::setModel(WalletModel *_model) // update the display unit, to not use the default ("QTUM") updateDisplayUnit(); + + if (m_model->wallet().privateKeysDisabled()) { + ui->pushButtonCreateContract->setText(tr("Cr&eate Unsigned")); + ui->pushButtonCreateContract->setToolTip(tr("Creates a Partially Signed Qtum Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); + } } bool CreateContract::isValidBytecode() diff --git a/src/qt/removedelegationpage.cpp b/src/qt/removedelegationpage.cpp index 65b7fb6809..95d0ad3339 100644 --- a/src/qt/removedelegationpage.cpp +++ b/src/qt/removedelegationpage.cpp @@ -75,6 +75,11 @@ void RemoveDelegationPage::setModel(WalletModel *_model) // update the display unit, to not use the default ("QTUM") updateDisplayUnit(); + + if (m_model->wallet().privateKeysDisabled()) { + ui->removeDelegationButton->setText(tr("Cr&eate Unsigned")); + ui->removeDelegationButton->setToolTip(tr("Creates a Partially Signed Qtum Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); + } } void RemoveDelegationPage::setClientModel(ClientModel *_clientModel) diff --git a/src/qt/sendtocontract.cpp b/src/qt/sendtocontract.cpp index 3b56b2943e..28a1defd85 100644 --- a/src/qt/sendtocontract.cpp +++ b/src/qt/sendtocontract.cpp @@ -140,6 +140,11 @@ void SendToContract::setModel(WalletModel *_model) // update the display unit, to not use the default ("QTUM") updateDisplayUnit(); + + if (m_model->wallet().privateKeysDisabled()) { + ui->pushButtonSendToContract->setText(tr("Cr&eate Unsigned")); + ui->pushButtonSendToContract->setToolTip(tr("Creates a Partially Signed Qtum Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); + } } bool SendToContract::isValidContractAddress() diff --git a/src/qt/sendtokenpage.cpp b/src/qt/sendtokenpage.cpp index 37346d2646..0b6cdad4ab 100644 --- a/src/qt/sendtokenpage.cpp +++ b/src/qt/sendtokenpage.cpp @@ -85,6 +85,11 @@ void SendTokenPage::setModel(WalletModel *_model) // update the display unit, to not use the default ("QTUM") updateDisplayUnit(); + + if (m_model->wallet().privateKeysDisabled()) { + ui->confirmButton->setText(tr("Cr&eate Unsigned")); + ui->confirmButton->setToolTip(tr("Creates a Partially Signed Qtum Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); + } } void SendTokenPage::setClientModel(ClientModel *_clientModel) From 86ed646470f5624ded5730ecc651a5d3b9a1514c Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 5 Feb 2021 15:16:09 +0100 Subject: [PATCH 062/164] Add psbt support in createcontract RPC --- src/rpc/client.cpp | 1 + src/wallet/rpcwallet.cpp | 95 +++++++++++++++++++++++++++++++++++----- 2 files changed, 85 insertions(+), 11 deletions(-) diff --git a/src/rpc/client.cpp b/src/rpc/client.cpp index a4bc239183..ca66b53493 100644 --- a/src/rpc/client.cpp +++ b/src/rpc/client.cpp @@ -189,6 +189,7 @@ static const CRPCConvertParam vRPCConvertParams[] = { "createcontract", 2, "gasPrice" }, { "createcontract", 4, "broadcast" }, { "createcontract", 5, "changeToSender" }, + { "createcontract", 6, "psbt" }, { "sendtocontract", 2, "amount" }, { "sendtocontract", 3, "gasLimit" }, { "sendtocontract", 4, "gasPrice" }, diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 9b2b98345b..04f48cde81 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -102,7 +102,7 @@ std::shared_ptr GetWalletForJSONRPCRequest(const JSONRPCRequest& reques return wallets.size() == 1 || (request.fHelp && wallets.size() > 0) ? wallets[0] : nullptr; } -bool GetSenderDest(CWallet * const pwallet, const CTransactionRef& tx, CTxDestination& txSenderDest) +bool GetSenderDest(CWallet * const pwallet, const CTransactionRef& tx, CTxDestination& txSenderDest, bool sign=true) { // Initialize variables CScript senderPubKey; @@ -115,7 +115,14 @@ bool GetSenderDest(CWallet * const pwallet, const CTransactionRef& tx, CTxDestin { if(out.scriptPubKey.HasOpSender()) { - ExtractSenderData(out.scriptPubKey, &senderPubKey, 0); + if(sign) + { + ExtractSenderData(out.scriptPubKey, &senderPubKey, 0); + } + else + { + GetSenderPubKey(out.scriptPubKey, senderPubKey); + } break; } } @@ -846,6 +853,28 @@ static UniValue splitutxosforaddress(const JSONRPCRequest& request) return obj; } +PSBTOutput GetPsbtOutput(const CTxOut& v, LegacyScriptPubKeyMan& spk_man) +{ + PSBTOutput out; + if(v.scriptPubKey.HasOpSender()) + { + CScript senderPubKey; + bool ok = GetSenderPubKey(v.scriptPubKey, senderPubKey); + CKeyID key_id = CKeyID(ExtractPublicKeyHash(senderPubKey)); + ok &= !key_id.IsNull(); + CPubKey vchPubKeyOut; + ok &= spk_man.GetPubKey(key_id, vchPubKeyOut); + KeyOriginInfo info; + ok &= spk_man.GetKeyOrigin(key_id, info); + if(ok) + { + out.hd_keypaths[vchPubKeyOut] = info; + } + } + + return out; +} + static UniValue createcontract(const JSONRPCRequest& request){ std::shared_ptr const wallet = GetWalletForJSONRPCRequest(request); @@ -873,6 +902,7 @@ static UniValue createcontract(const JSONRPCRequest& request){ {"senderaddress", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "The qtum address that will be used to create the contract."}, {"broadcast", RPCArg::Type::BOOL, RPCArg::Optional::OMITTED, "Whether to broadcast the transaction or not."}, {"changeToSender", RPCArg::Type::BOOL, RPCArg::Optional::OMITTED, "Return the change to the sender."}, + {"psbt", RPCArg::Type::BOOL, RPCArg::Optional::OMITTED, "Create partially signed transaction."}, }, RPCResult{ RPCResult::Type::ARR, "", "", @@ -942,6 +972,12 @@ static UniValue createcontract(const JSONRPCRequest& request){ fChangeToSender=request.params[5].get_bool(); } + bool fPsbt=pwallet->IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS); + if (request.params.size() > 6){ + fPsbt=request.params[6].get_bool(); + } + if(fPsbt) fBroadcast=false; + CCoinControl coinControl; CTxDestination signSenderAddress = CNoDestination(); @@ -1000,7 +1036,9 @@ static UniValue createcontract(const JSONRPCRequest& request){ CAmount nGasFee=nGasPrice*nGasLimit; - CAmount curBalance = pwallet->GetBalance().m_mine_trusted; + const auto bal = pwallet->GetBalance(); + CAmount curBalance = bal.m_mine_trusted; + if(fPsbt) curBalance += bal.m_watchonly_trusted; // Check amount if (nGasFee <= 0) @@ -1020,9 +1058,18 @@ static UniValue createcontract(const JSONRPCRequest& request){ if(IsValidDestination(signSenderAddress)) { CKeyID key_id = GetKeyForDestination(spk_man, signSenderAddress); - CKey key; - if (!spk_man.GetKey(key_id, key)) { - throw JSONRPCError(RPC_WALLET_ERROR, "Private key not available"); + if(fPsbt) + { + if(!pwallet->IsMine(signSenderAddress)) { + throw JSONRPCError(RPC_WALLET_ERROR, "Sender address not mine"); + } + } + else + { + CKey key; + if (!spk_man.GetKey(key_id, key)) { + throw JSONRPCError(RPC_WALLET_ERROR, "Private key not available"); + } } std::vector scriptSig; scriptPubKey = (CScript() << CScriptNum(addresstype::PUBKEYHASH) << ToByteVector(key_id) << ToByteVector(scriptSig) << OP_SENDER) + scriptPubKey; @@ -1043,21 +1090,47 @@ static UniValue createcontract(const JSONRPCRequest& request){ vecSend.push_back(recipient); CTransactionRef tx; - if (!pwallet->CreateTransaction(*locked_chain, vecSend, tx, nFeeRequired, nChangePosRet, strError, coinControl, true, nGasFee, true, signSenderAddress)) { - if (nFeeRequired > pwallet->GetBalance().m_mine_trusted) + bool sign = !fPsbt; + if (!pwallet->CreateTransaction(*locked_chain, vecSend, tx, nFeeRequired, nChangePosRet, strError, coinControl, sign, nGasFee, true, signSenderAddress)) { + if (nFeeRequired > curBalance) strError = strprintf("Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!", FormatMoney(nFeeRequired)); throw JSONRPCError(RPC_WALLET_ERROR, strError); } CTxDestination txSenderDest; - GetSenderDest(pwallet, tx, txSenderDest); + GetSenderDest(pwallet, tx, txSenderDest, sign); if (fHasSender && !(senderAddress == txSenderDest)){ throw JSONRPCError(RPC_TYPE_ERROR, "Sender could not be set, transaction was not committed!"); } UniValue result(UniValue::VOBJ); - if(fBroadcast){ + if(fPsbt){ + // Make a blank psbt + PartiallySignedTransaction psbtx; + CMutableTransaction rawTx = CMutableTransaction(*tx); + psbtx.tx = rawTx; + for (unsigned int i = 0; i < rawTx.vin.size(); ++i) { + psbtx.inputs.push_back(PSBTInput()); + } + for (unsigned int i = 0; i < rawTx.vout.size(); ++i) { + psbtx.outputs.push_back(GetPsbtOutput(rawTx.vout[i], spk_man)); + } + + // Fill transaction with out data but don't sign + bool bip32derivs = true; + bool complete = true; + const TransactionError err = pwallet->FillPSBT(psbtx, complete, 1, false, bip32derivs); + if (err != TransactionError::OK) { + throw JSONRPCTransactionError(err); + } + + // Serialize the PSBT + CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); + ssTx << psbtx; + result.pushKV("psbt", EncodeBase64((unsigned char*)ssTx.data(), ssTx.size())); + } + else if(fBroadcast){ pwallet->CommitTransaction(tx, {}, {}); std::string txId=tx->GetHash().GetHex(); @@ -6124,7 +6197,7 @@ static const CRPCCommand commands[] = { "wallet", "walletpassphrasechange", &walletpassphrasechange, {"oldpassphrase","newpassphrase"} }, { "wallet", "walletprocesspsbt", &walletprocesspsbt, {"psbt","sign","sighashtype","bip32derivs"} }, { "wallet", "reservebalance", &reservebalance, {"reserve", "amount"} }, - { "wallet", "createcontract", &createcontract, {"bytecode", "gasLimit", "gasPrice", "senderAddress", "broadcast", "changeToSender"} }, + { "wallet", "createcontract", &createcontract, {"bytecode", "gasLimit", "gasPrice", "senderAddress", "broadcast", "changeToSender", "psbt"} }, { "wallet", "sendtocontract", &sendtocontract, {"contractaddress", "bytecode", "amount", "gasLimit", "gasPrice", "senderAddress", "broadcast", "changeToSender"} }, { "wallet", "removedelegationforaddress", &removedelegationforaddress, {"address", "gasLimit", "gasPrice"} }, { "wallet", "setdelegateforaddress", &setdelegateforaddress, {"staker", "fee", "address", "gasLimit", "gasPrice"} }, From 874911c2966ea3b7cd7cad90c3da435eebe06366 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 5 Feb 2021 16:18:54 +0100 Subject: [PATCH 063/164] Add psbt support in createcontract GUI --- src/qt/createcontract.cpp | 39 +++++++++++++++++++++++++++++---------- src/qt/createcontract.h | 2 ++ src/qt/walletview.cpp | 2 ++ 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/qt/createcontract.cpp b/src/qt/createcontract.cpp index 72e4c81368..00a271ab67 100644 --- a/src/qt/createcontract.cpp +++ b/src/qt/createcontract.cpp @@ -206,9 +206,19 @@ void CreateContract::on_createContractClicked() ExecRPCCommand::appendParam(lstParams, PARAM_GASPRICE, BitcoinUnits::format(unit, gasPrice, false, BitcoinUnits::separatorNever)); ExecRPCCommand::appendParam(lstParams, PARAM_SENDER, ui->lineEditSenderAddress->currentText()); - QString questionString = tr("Are you sure you want to create contract?
"); + QString questionString; + if (m_model->wallet().privateKeysDisabled()) { + questionString.append(tr("Do you want to draft this create contract transaction?")); + questionString.append("
"); + questionString.append(tr("This will produce a Partially Signed Qtum Transaction (PSBT) which you can copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); + questionString.append(""); + } else { + questionString.append(tr("Are you sure you want to create contract?
")); + } - SendConfirmationDialog confirmationDialog(tr("Confirm contract creation."), questionString, "", "", SEND_CONFIRM_DELAY, tr("Send"), this); + const QString confirmation = m_model->wallet().privateKeysDisabled() ? tr("Confirm contract creation proposal.") : tr("Confirm contract creation."); + const QString confirmButtonText = m_model->wallet().privateKeysDisabled() ? tr("Copy PSBT to clipboard") : tr("Send"); + SendConfirmationDialog confirmationDialog(confirmation, questionString, "", "", SEND_CONFIRM_DELAY, confirmButtonText, this); confirmationDialog.exec(); QMessageBox::StandardButton retval = (QMessageBox::StandardButton)confirmationDialog.result(); if(retval == QMessageBox::Yes) @@ -216,14 +226,23 @@ void CreateContract::on_createContractClicked() // Execute RPC command line if(errorMessage.isEmpty() && m_execRPCCommand->exec(m_model->node(), m_model, lstParams, result, resultJson, errorMessage)) { - ContractResult *widgetResult = new ContractResult(ui->stackedWidget); - widgetResult->setResultData(result, FunctionABI(), QList(), ContractResult::CreateResult); - ui->stackedWidget->addWidget(widgetResult); - int position = ui->stackedWidget->count() - 1; - m_results = position == 1 ? 1 : m_results + 1; - - m_tabInfo->addTab(position, tr("Result %1").arg(m_results)); - m_tabInfo->setCurrent(position); + if(m_model->wallet().privateKeysDisabled()) + { + QVariantMap variantMap = result.toMap(); + GUIUtil::setClipboard(variantMap.value("psbt").toString()); + Q_EMIT message(tr("PSBT copied"), "Copied to clipboard", CClientUIInterface::MSG_INFORMATION); + } + else + { + ContractResult *widgetResult = new ContractResult(ui->stackedWidget); + widgetResult->setResultData(result, FunctionABI(), QList(), ContractResult::CreateResult); + ui->stackedWidget->addWidget(widgetResult); + int position = ui->stackedWidget->count() - 1; + m_results = position == 1 ? 1 : m_results + 1; + + m_tabInfo->addTab(position, tr("Result %1").arg(m_results)); + m_tabInfo->setCurrent(position); + } } else { diff --git a/src/qt/createcontract.h b/src/qt/createcontract.h index b625f813e5..7275e06f76 100644 --- a/src/qt/createcontract.h +++ b/src/qt/createcontract.h @@ -30,6 +30,8 @@ class CreateContract : public QWidget bool isDataValid(); Q_SIGNALS: + // Fired when a message should be reported to the user + void message(const QString &title, const QString &message, unsigned int style); public Q_SLOTS: void on_clearAllClicked(); diff --git a/src/qt/walletview.cpp b/src/qt/walletview.cpp index f2f092674e..d4ddd4fa36 100644 --- a/src/qt/walletview.cpp +++ b/src/qt/walletview.cpp @@ -115,6 +115,8 @@ WalletView::WalletView(const PlatformStyle *_platformStyle, QWidget *parent): connect(sendCoinsPage, &SendCoinsDialog::message, this, &WalletView::message); // Pass through messages from transactionView connect(transactionView, &TransactionView::message, this, &WalletView::message); + // Pass through messages from createContractPage + connect(createContractPage, &CreateContract::message, this, &WalletView::message); } WalletView::~WalletView() From fb4539382b9325c992e5e03a7ec41a05e862c21e Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 8 Feb 2021 16:03:52 +0100 Subject: [PATCH 064/164] Add psbt support in sendtocontract RPC --- src/rpc/client.cpp | 1 + src/wallet/rpcwallet.cpp | 62 ++++++++++++++++++++++++++++++++++------ 2 files changed, 54 insertions(+), 9 deletions(-) diff --git a/src/rpc/client.cpp b/src/rpc/client.cpp index ca66b53493..e41f193c43 100644 --- a/src/rpc/client.cpp +++ b/src/rpc/client.cpp @@ -195,6 +195,7 @@ static const CRPCConvertParam vRPCConvertParams[] = { "sendtocontract", 4, "gasPrice" }, { "sendtocontract", 6, "broadcast" }, { "sendtocontract", 7, "changeToSender" }, + { "sendtocontract", 8, "psbt" }, { "removedelegationforaddress", 1, "gasLimit" }, { "removedelegationforaddress", 2, "gasPrice" }, { "setdelegateforaddress", 1, "fee" }, diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 04f48cde81..1522814228 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -1236,6 +1236,12 @@ UniValue SendToContract(interfaces::Chain::Lock& locked_chain, CWallet* const pw fChangeToSender=params[7].get_bool(); } + bool fPsbt=pwallet->IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS); + if (params.size() > 8){ + fPsbt=params[8].get_bool(); + } + if(fPsbt) fBroadcast=false; + CCoinControl coinControl; CTxDestination signSenderAddress = CNoDestination(); @@ -1296,7 +1302,9 @@ UniValue SendToContract(interfaces::Chain::Lock& locked_chain, CWallet* const pw CAmount nGasFee=nGasPrice*nGasLimit; - CAmount curBalance = pwallet->GetBalance().m_mine_trusted; + const auto bal = pwallet->GetBalance(); + CAmount curBalance = bal.m_mine_trusted; + if(fPsbt) curBalance += bal.m_watchonly_trusted; // Check amount if (nGasFee <= 0) @@ -1316,9 +1324,18 @@ UniValue SendToContract(interfaces::Chain::Lock& locked_chain, CWallet* const pw if(IsValidDestination(signSenderAddress)) { CKeyID key_id = GetKeyForDestination(spk_man, signSenderAddress); - CKey key; - if (!spk_man.GetKey(key_id, key)) { - throw JSONRPCError(RPC_WALLET_ERROR, "Private key not available"); + if(fPsbt) + { + if(!pwallet->IsMine(signSenderAddress)) { + throw JSONRPCError(RPC_WALLET_ERROR, "Sender address not mine"); + } + } + else + { + CKey key; + if (!spk_man.GetKey(key_id, key)) { + throw JSONRPCError(RPC_WALLET_ERROR, "Private key not available"); + } } std::vector scriptSig; scriptPubKey = (CScript() << CScriptNum(addresstype::PUBKEYHASH) << ToByteVector(key_id) << ToByteVector(scriptSig) << OP_SENDER) + scriptPubKey; @@ -1338,15 +1355,16 @@ UniValue SendToContract(interfaces::Chain::Lock& locked_chain, CWallet* const pw CRecipient recipient = {scriptPubKey, nAmount, false}; vecSend.push_back(recipient); + bool sign = !fPsbt; CTransactionRef tx; - if (!pwallet->CreateTransaction(locked_chain, vecSend, tx, nFeeRequired, nChangePosRet, strError, coinControl, true, nGasFee, true, signSenderAddress)) { - if (nFeeRequired > pwallet->GetBalance().m_mine_trusted) + if (!pwallet->CreateTransaction(locked_chain, vecSend, tx, nFeeRequired, nChangePosRet, strError, coinControl, sign, nGasFee, true, signSenderAddress)) { + if (nFeeRequired > curBalance) strError = strprintf("Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!", FormatMoney(nFeeRequired)); throw JSONRPCError(RPC_WALLET_ERROR, strError); } CTxDestination txSenderDest; - GetSenderDest(pwallet, tx, txSenderDest); + GetSenderDest(pwallet, tx, txSenderDest, sign); if (fHasSender && !(senderAddress == txSenderDest)){ throw JSONRPCError(RPC_TYPE_ERROR, "Sender could not be set, transaction was not committed!"); @@ -1354,7 +1372,32 @@ UniValue SendToContract(interfaces::Chain::Lock& locked_chain, CWallet* const pw UniValue result(UniValue::VOBJ); - if(fBroadcast){ + if(fPsbt){ + // Make a blank psbt + PartiallySignedTransaction psbtx; + CMutableTransaction rawTx = CMutableTransaction(*tx); + psbtx.tx = rawTx; + for (unsigned int i = 0; i < rawTx.vin.size(); ++i) { + psbtx.inputs.push_back(PSBTInput()); + } + for (unsigned int i = 0; i < rawTx.vout.size(); ++i) { + psbtx.outputs.push_back(GetPsbtOutput(rawTx.vout[i], spk_man)); + } + + // Fill transaction with out data but don't sign + bool bip32derivs = true; + bool complete = true; + const TransactionError err = pwallet->FillPSBT(psbtx, complete, 1, false, bip32derivs); + if (err != TransactionError::OK) { + throw JSONRPCTransactionError(err); + } + + // Serialize the PSBT + CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); + ssTx << psbtx; + result.pushKV("psbt", EncodeBase64((unsigned char*)ssTx.data(), ssTx.size())); + } + else if(fBroadcast){ pwallet->CommitTransaction(tx, {}, {}); std::string txId=tx->GetHash().GetHex(); @@ -1402,6 +1445,7 @@ static UniValue sendtocontract(const JSONRPCRequest& request){ {"senderaddress", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "The qtum address that will be used as sender."}, {"broadcast", RPCArg::Type::BOOL, RPCArg::Optional::OMITTED, "Whether to broadcast the transaction or not."}, {"changeToSender", RPCArg::Type::BOOL, RPCArg::Optional::OMITTED, "Return the change to the sender."}, + {"psbt", RPCArg::Type::BOOL, RPCArg::Optional::OMITTED, "Create partially signed transaction."}, }, RPCResult{ RPCResult::Type::ARR, "", "", @@ -6198,7 +6242,7 @@ static const CRPCCommand commands[] = { "wallet", "walletprocesspsbt", &walletprocesspsbt, {"psbt","sign","sighashtype","bip32derivs"} }, { "wallet", "reservebalance", &reservebalance, {"reserve", "amount"} }, { "wallet", "createcontract", &createcontract, {"bytecode", "gasLimit", "gasPrice", "senderAddress", "broadcast", "changeToSender", "psbt"} }, - { "wallet", "sendtocontract", &sendtocontract, {"contractaddress", "bytecode", "amount", "gasLimit", "gasPrice", "senderAddress", "broadcast", "changeToSender"} }, + { "wallet", "sendtocontract", &sendtocontract, {"contractaddress", "bytecode", "amount", "gasLimit", "gasPrice", "senderAddress", "broadcast", "changeToSender", "psbt"} }, { "wallet", "removedelegationforaddress", &removedelegationforaddress, {"address", "gasLimit", "gasPrice"} }, { "wallet", "setdelegateforaddress", &setdelegateforaddress, {"staker", "fee", "address", "gasLimit", "gasPrice"} }, { "wallet", "setsuperstakervaluesforaddress", &setsuperstakervaluesforaddress, {"params"} }, From d28da17c14effaf27ff9f9c2d48582533ef59d1e Mon Sep 17 00:00:00 2001 From: Toni Markov Date: Tue, 9 Feb 2021 13:38:05 +0100 Subject: [PATCH 065/164] Update send confirmation for psbt --- src/qt/adddelegationpage.cpp | 21 +++++++++++++++++---- src/qt/adddelegationpage.h | 4 ++++ src/qt/delegationpage.cpp | 3 +++ src/qt/delegationpage.h | 2 ++ src/qt/qrctoken.cpp | 2 ++ src/qt/qrctoken.h | 2 ++ src/qt/removedelegationpage.cpp | 16 ++++++++++++++-- src/qt/removedelegationpage.h | 4 ++++ src/qt/sendtocontract.cpp | 15 +++++++++++++-- src/qt/sendtocontract.h | 2 ++ src/qt/sendtokenpage.cpp | 14 ++++++++++++-- src/qt/sendtokenpage.h | 4 ++++ src/qt/walletview.cpp | 7 +++++++ 13 files changed, 86 insertions(+), 10 deletions(-) diff --git a/src/qt/adddelegationpage.cpp b/src/qt/adddelegationpage.cpp index 1332f8ff94..29626b0e46 100644 --- a/src/qt/adddelegationpage.cpp +++ b/src/qt/adddelegationpage.cpp @@ -249,12 +249,25 @@ void AddDelegationPage::on_addDelegationClicked() ExecRPCCommand::appendParam(lstParams, PARAM_GASLIMIT, QString::number(gasLimit)); ExecRPCCommand::appendParam(lstParams, PARAM_GASPRICE, BitcoinUnits::format(unit, gasPrice, false, BitcoinUnits::separatorNever)); + QString questionString; + if (m_model->wallet().privateKeysDisabled()) { + questionString.append(tr("Do you want to draft this transaction?")); + questionString.append("
"); + questionString.append(tr("Please, review your transaction proposal. This will produce a Partially Signed Qtum Transaction (PSBT) which you can copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); + questionString.append(""); + questionString.append(tr("

Delegate the address to the staker
")); + questionString.append(tr("%1?") + .arg(ui->lineEditStakerAddress->text())); + } else { + questionString.append(tr("Are you sure you want to delegate the address to the staker

")); + questionString.append(tr("%1?") + .arg(ui->lineEditStakerAddress->text())); + } - QString questionString = tr("Are you sure you want to delegate the address to the staker

"); - questionString.append(tr("%1?") - .arg(ui->lineEditStakerAddress->text())); + const QString confirmation = m_model->wallet().privateKeysDisabled() ? tr("Confirm address delegation proposal.") : tr("Confirm address delegation to staker."); + const QString confirmButtonText = m_model->wallet().privateKeysDisabled() ? tr("Copy PSBT to clipboard") : tr("Send"); + SendConfirmationDialog confirmationDialog(confirmation, questionString, "", "", SEND_CONFIRM_DELAY, confirmButtonText, this); - SendConfirmationDialog confirmationDialog(tr("Confirm address delegation to staker."), questionString, "", "", SEND_CONFIRM_DELAY, tr("Send"), this); confirmationDialog.exec(); QMessageBox::StandardButton retval = (QMessageBox::StandardButton)confirmationDialog.result(); diff --git a/src/qt/adddelegationpage.h b/src/qt/adddelegationpage.h index 5cbc0686bc..fad1ec4d50 100644 --- a/src/qt/adddelegationpage.h +++ b/src/qt/adddelegationpage.h @@ -23,6 +23,10 @@ class AddDelegationPage : public QDialog bool isValidStakerAddress(); bool isDataValid(); +Q_SIGNALS: + // Fired when a message should be reported to the user + void message(const QString &title, const QString &message, unsigned int style); + public Q_SLOTS: void on_gasInfoChanged(quint64 blockGasLimit, quint64 minGasPrice, quint64 nGasPrice); void accept(); diff --git a/src/qt/delegationpage.cpp b/src/qt/delegationpage.cpp index 7f9fe11e1f..377de40393 100644 --- a/src/qt/delegationpage.cpp +++ b/src/qt/delegationpage.cpp @@ -52,6 +52,9 @@ DelegationPage::DelegationPage(const PlatformStyle *platformStyle, QWidget *pare connect(m_delegationList, &DelegationListWidget::splitCoins, this, &DelegationPage::on_splitCoins); connect(m_delegationList, &DelegationListWidget::restoreDelegations, this, &DelegationPage::on_restoreDelegations); + connect(m_addDelegationPage, &AddDelegationPage::message, this, &DelegationPage::message); + connect(m_removeDelegationPage, &RemoveDelegationPage::message, this, &DelegationPage::message); + contextMenu = new QMenu(m_delegationList); contextMenu->addAction(copyStakerNameAction); contextMenu->addAction(copyStakerAddressAction); diff --git a/src/qt/delegationpage.h b/src/qt/delegationpage.h index d53aa6dba1..fa3895d112 100644 --- a/src/qt/delegationpage.h +++ b/src/qt/delegationpage.h @@ -31,6 +31,8 @@ class DelegationPage : public QWidget void setClientModel(ClientModel *clientModel); Q_SIGNALS: + // Fired when a message should be reported to the user + void message(const QString &title, const QString &message, unsigned int style); public Q_SLOTS: void on_goToSplitCoinsPage(); diff --git a/src/qt/qrctoken.cpp b/src/qt/qrctoken.cpp index f86d194351..13d809f4e3 100644 --- a/src/qt/qrctoken.cpp +++ b/src/qt/qrctoken.cpp @@ -66,6 +66,8 @@ QRCToken::QRCToken(const PlatformStyle *platformStyle, QWidget *parent) : connect(removeTokenAction, &QAction::triggered, this, &QRCToken::removeToken); connect(m_tokenList, &TokenListWidget::customContextMenuRequested, this, &QRCToken::contextualMenu); + + connect(m_sendTokenPage, &SendTokenPage::message, this, &QRCToken::message); } QRCToken::~QRCToken() diff --git a/src/qt/qrctoken.h b/src/qt/qrctoken.h index 417c23770a..59f6332e2f 100644 --- a/src/qt/qrctoken.h +++ b/src/qt/qrctoken.h @@ -32,6 +32,8 @@ class QRCToken : public QWidget void setClientModel(ClientModel *clientModel); Q_SIGNALS: + // Fired when a message should be reported to the user + void message(const QString &title, const QString &message, unsigned int style); public Q_SLOTS: void on_goToSendTokenPage(); diff --git a/src/qt/removedelegationpage.cpp b/src/qt/removedelegationpage.cpp index 95d0ad3339..c8b56049e4 100644 --- a/src/qt/removedelegationpage.cpp +++ b/src/qt/removedelegationpage.cpp @@ -211,11 +211,23 @@ void RemoveDelegationPage::on_removeDelegationClicked() ExecRPCCommand::appendParam(lstParams, PARAM_GASLIMIT, QString::number(gasLimit)); ExecRPCCommand::appendParam(lstParams, PARAM_GASPRICE, BitcoinUnits::format(unit, gasPrice, false, BitcoinUnits::separatorNever)); - QString questionString = tr("Are you sure you want to remove the delegation for the address:

"); + QString questionString; + if (m_model->wallet().privateKeysDisabled()) { + questionString.append(tr("Do you want to draft this transaction?")); + questionString.append("
"); + questionString.append(tr("Please, review your transaction proposal. This will produce a Partially Signed Qtum Transaction (PSBT) which you can copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); + questionString.append(""); + questionString.append(tr("

Remove delegation for address:
")); + } else { + questionString.append(tr("Are you sure you want to remove the delegation for the address:

")); + + } questionString.append(tr("%1?") .arg(ui->lineEditAddress->text())); - SendConfirmationDialog confirmationDialog(tr("Confirm remove delegation."), questionString, "", "", SEND_CONFIRM_DELAY, tr("Send"), this); + const QString confirmation = m_model->wallet().privateKeysDisabled() ? tr("Confirm remove delegation proposal.") : tr("Confirm remove delegation."); + const QString confirmButtonText = m_model->wallet().privateKeysDisabled() ? tr("Copy PSBT to clipboard") : tr("Send"); + SendConfirmationDialog confirmationDialog(confirmation, questionString, "", "", SEND_CONFIRM_DELAY, confirmButtonText, this); confirmationDialog.exec(); QMessageBox::StandardButton retval = (QMessageBox::StandardButton)confirmationDialog.result(); diff --git a/src/qt/removedelegationpage.h b/src/qt/removedelegationpage.h index 97b96bd11a..570cdaff06 100644 --- a/src/qt/removedelegationpage.h +++ b/src/qt/removedelegationpage.h @@ -23,6 +23,10 @@ class RemoveDelegationPage : public QDialog void setDelegationData(const QString& address, const QString& hash); bool isDataValid(); +Q_SIGNALS: + // Fired when a message should be reported to the user + void message(const QString &title, const QString &message, unsigned int style); + public Q_SLOTS: void on_gasInfoChanged(quint64 blockGasLimit, quint64 minGasPrice, quint64 nGasPrice); void accept(); diff --git a/src/qt/sendtocontract.cpp b/src/qt/sendtocontract.cpp index 28a1defd85..1070475225 100644 --- a/src/qt/sendtocontract.cpp +++ b/src/qt/sendtocontract.cpp @@ -238,11 +238,22 @@ void SendToContract::on_sendToContractClicked() ExecRPCCommand::appendParam(lstParams, PARAM_GASPRICE, BitcoinUnits::format(unit, gasPrice, false, BitcoinUnits::separatorNever)); ExecRPCCommand::appendParam(lstParams, PARAM_SENDER, ui->lineEditSenderAddress->currentText()); - QString questionString = tr("Are you sure you want to send to the contract:

"); + QString questionString; + if (m_model->wallet().privateKeysDisabled()) { + questionString.append(tr("Do you want to draft this transaction?")); + questionString.append("
"); + questionString.append(tr("Please, review your transaction proposal. This will produce a Partially Signed Qtum Transaction (PSBT) which you can copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); + questionString.append(""); + questionString.append(tr("

Send to the contract:
")); + } else { + questionString.append(tr("Are you sure you want to send to the contract:

")); + } questionString.append(tr("%1?") .arg(ui->lineEditContractAddress->text())); - SendConfirmationDialog confirmationDialog(tr("Confirm sending to contract."), questionString, "", "", SEND_CONFIRM_DELAY, tr("Send"), this); + const QString confirmation = m_model->wallet().privateKeysDisabled() ? tr("Confirm sending to contract proposal.") : tr("Confirm sending to contract."); + const QString confirmButtonText = m_model->wallet().privateKeysDisabled() ? tr("Copy PSBT to clipboard") : tr("Send"); + SendConfirmationDialog confirmationDialog(confirmation, questionString, "", "", SEND_CONFIRM_DELAY, confirmButtonText, this); confirmationDialog.exec(); QMessageBox::StandardButton retval = (QMessageBox::StandardButton)confirmationDialog.result(); if(retval == QMessageBox::Yes) diff --git a/src/qt/sendtocontract.h b/src/qt/sendtocontract.h index 3d5d1e7460..a4180ec990 100644 --- a/src/qt/sendtocontract.h +++ b/src/qt/sendtocontract.h @@ -32,6 +32,8 @@ class SendToContract : public QWidget void setContractAddress(const QString &address); Q_SIGNALS: + // Fired when a message should be reported to the user + void message(const QString &title, const QString &message, unsigned int style); public Q_SLOTS: void on_clearAllClicked(); diff --git a/src/qt/sendtokenpage.cpp b/src/qt/sendtokenpage.cpp index 0b6cdad4ab..a4e51e3a85 100644 --- a/src/qt/sendtokenpage.cpp +++ b/src/qt/sendtokenpage.cpp @@ -186,13 +186,23 @@ void SendTokenPage::on_confirmClicked() std::string amountToSend = ui->lineEditAmount->text().toStdString(); QString amountFormated = BitcoinUnits::formatToken(m_selectedToken->decimals, ui->lineEditAmount->value(), false, BitcoinUnits::separatorAlways); - QString questionString = tr("Are you sure you want to send?

"); + QString questionString; + if (m_model->wallet().privateKeysDisabled()) { + questionString.append(tr("Do you want to draft this send token transaction?")); + questionString.append("
"); + questionString.append(tr("Please, review your transaction proposal. This will produce a Partially Signed Qtum Transaction (PSBT) which you can copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); + questionString.append("

"); + } else { + questionString.append(tr("Are you sure you want to send?

")); + } questionString.append(tr("%1 %2 to ") .arg(amountFormated).arg(QString::fromStdString(m_selectedToken->symbol))); questionString.append(tr("
%3
") .arg(QString::fromStdString(toAddress))); - SendConfirmationDialog confirmationDialog(tr("Confirm send token."), questionString, "", "", SEND_CONFIRM_DELAY, tr("Send"), this); + const QString confirmation = m_model->wallet().privateKeysDisabled() ? tr("Confirm send token proposal.") : tr("Confirm send token."); + const QString confirmButtonText = m_model->wallet().privateKeysDisabled() ? tr("Copy PSBT to clipboard") : tr("Send"); + SendConfirmationDialog confirmationDialog(confirmation, questionString, "", "", SEND_CONFIRM_DELAY, confirmButtonText, this); confirmationDialog.exec(); QMessageBox::StandardButton retval = (QMessageBox::StandardButton)confirmationDialog.result(); if(retval == QMessageBox::Yes) diff --git a/src/qt/sendtokenpage.h b/src/qt/sendtokenpage.h index bbb84d575c..830477fb25 100644 --- a/src/qt/sendtokenpage.h +++ b/src/qt/sendtokenpage.h @@ -28,6 +28,10 @@ class SendTokenPage : public QDialog void setTokenData(std::string address, std::string sender, std::string symbol, int8_t decimals, std::string balance); +Q_SIGNALS: + // Fired when a message should be reported to the user + void message(const QString &title, const QString &message, unsigned int style); + private Q_SLOTS: void on_clearButton_clicked(); void on_gasInfoChanged(quint64 blockGasLimit, quint64 minGasPrice, quint64 nGasPrice); diff --git a/src/qt/walletview.cpp b/src/qt/walletview.cpp index f27c2c372f..5ce71b1543 100644 --- a/src/qt/walletview.cpp +++ b/src/qt/walletview.cpp @@ -118,6 +118,13 @@ WalletView::WalletView(const PlatformStyle *_platformStyle, QWidget *parent): connect(transactionView, &TransactionView::message, this, &WalletView::message); // Pass through messages from createContractPage connect(createContractPage, &CreateContract::message, this, &WalletView::message); + // Pass through messages from sendToContractPage + connect(sendToContractPage, &SendToContract::message, this, &WalletView::message); + // Pass through messages from QRCTokenPage + connect(QRCTokenPage, &QRCToken::message, this, &WalletView::message); + // Pass through messages from delegationPage + connect(delegationPage, &DelegationPage::message, this, &WalletView::message); + } WalletView::~WalletView() From a596114120ab31c0d39d336f44af5af3ccd2f9fc Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Tue, 9 Feb 2021 15:06:15 +0100 Subject: [PATCH 066/164] Copy psbt to clipboard --- src/qt/adddelegationpage.cpp | 24 ++++++++++++++++-------- src/qt/removedelegationpage.cpp | 13 +++++++++++-- src/qt/sendtocontract.cpp | 25 +++++++++++++++++-------- src/qt/sendtokenpage.cpp | 27 ++++++++++++++++++--------- src/qt/token.cpp | 16 +++++++++++++++- src/qt/token.h | 1 + 6 files changed, 78 insertions(+), 28 deletions(-) diff --git a/src/qt/adddelegationpage.cpp b/src/qt/adddelegationpage.cpp index 29626b0e46..80dd6b41f0 100644 --- a/src/qt/adddelegationpage.cpp +++ b/src/qt/adddelegationpage.cpp @@ -281,14 +281,22 @@ void AddDelegationPage::on_addDelegationClicked() else { QVariantMap variantMap = result.toMap(); - std::string txid = variantMap.value("txid").toString().toStdString(); - interfaces::DelegationInfo delegation; - delegation.delegate_address = delegateAddress.toStdString(); - delegation.staker_address = stakerAddress.toStdString(); - delegation.staker_name = stakerName.trimmed().toStdString(); - delegation.fee = stakerFee; - delegation.create_tx_hash.SetHex(txid); - m_model->wallet().addDelegationEntry(delegation); + if(m_model->wallet().privateKeysDisabled()) + { + GUIUtil::setClipboard(variantMap.value("psbt").toString()); + Q_EMIT message(tr("PSBT copied"), "Copied to clipboard", CClientUIInterface::MSG_INFORMATION); + } + else + { + std::string txid = variantMap.value("txid").toString().toStdString(); + interfaces::DelegationInfo delegation; + delegation.delegate_address = delegateAddress.toStdString(); + delegation.staker_address = stakerAddress.toStdString(); + delegation.staker_name = stakerName.trimmed().toStdString(); + delegation.fee = stakerFee; + delegation.create_tx_hash.SetHex(txid); + m_model->wallet().addDelegationEntry(delegation); + } } accept(); diff --git a/src/qt/removedelegationpage.cpp b/src/qt/removedelegationpage.cpp index c8b56049e4..ce5d6dad21 100644 --- a/src/qt/removedelegationpage.cpp +++ b/src/qt/removedelegationpage.cpp @@ -241,8 +241,17 @@ void RemoveDelegationPage::on_removeDelegationClicked() else { QVariantMap variantMap = result.toMap(); - std::string txid = variantMap.value("txid").toString().toStdString(); - m_model->wallet().setDelegationRemoved(sHash, txid); + if(m_model->wallet().privateKeysDisabled()) + { + QVariantMap variantMap = result.toMap(); + GUIUtil::setClipboard(variantMap.value("psbt").toString()); + Q_EMIT message(tr("PSBT copied"), "Copied to clipboard", CClientUIInterface::MSG_INFORMATION); + } + else + { + std::string txid = variantMap.value("txid").toString().toStdString(); + m_model->wallet().setDelegationRemoved(sHash, txid); + } } accept(); diff --git a/src/qt/sendtocontract.cpp b/src/qt/sendtocontract.cpp index 1070475225..2bd5fc90d2 100644 --- a/src/qt/sendtocontract.cpp +++ b/src/qt/sendtocontract.cpp @@ -261,14 +261,23 @@ void SendToContract::on_sendToContractClicked() // Execute RPC command line if(errorMessage.isEmpty() && m_execRPCCommand->exec(m_model->node(), m_model, lstParams, result, resultJson, errorMessage)) { - ContractResult *widgetResult = new ContractResult(ui->stackedWidget); - widgetResult->setResultData(result, FunctionABI(), m_ABIFunctionField->getParamsValues(), ContractResult::SendToResult); - ui->stackedWidget->addWidget(widgetResult); - int position = ui->stackedWidget->count() - 1; - m_results = position == 1 ? 1 : m_results + 1; - - m_tabInfo->addTab(position, tr("Result %1").arg(m_results)); - m_tabInfo->setCurrent(position); + if(m_model->wallet().privateKeysDisabled()) + { + QVariantMap variantMap = result.toMap(); + GUIUtil::setClipboard(variantMap.value("psbt").toString()); + Q_EMIT message(tr("PSBT copied"), "Copied to clipboard", CClientUIInterface::MSG_INFORMATION); + } + else + { + ContractResult *widgetResult = new ContractResult(ui->stackedWidget); + widgetResult->setResultData(result, FunctionABI(), m_ABIFunctionField->getParamsValues(), ContractResult::SendToResult); + ui->stackedWidget->addWidget(widgetResult); + int position = ui->stackedWidget->count() - 1; + m_results = position == 1 ? 1 : m_results + 1; + + m_tabInfo->addTab(position, tr("Result %1").arg(m_results)); + m_tabInfo->setCurrent(position); + } } else { diff --git a/src/qt/sendtokenpage.cpp b/src/qt/sendtokenpage.cpp index a4e51e3a85..fd5613655f 100644 --- a/src/qt/sendtokenpage.cpp +++ b/src/qt/sendtokenpage.cpp @@ -209,15 +209,24 @@ void SendTokenPage::on_confirmClicked() { if(m_tokenABI->transfer(toAddress, amountToSend, true)) { - interfaces::TokenTx tokenTx; - tokenTx.contract_address = m_selectedToken->address; - tokenTx.sender_address = m_selectedToken->sender; - tokenTx.receiver_address = toAddress; - dev::u256 nValue(amountToSend); - tokenTx.value = u256Touint(nValue); - tokenTx.tx_hash = uint256S(m_tokenABI->getTxId()); - tokenTx.label = label; - m_model->wallet().addTokenTxEntry(tokenTx); + if(m_model->wallet().privateKeysDisabled()) + { + QString psbt = QString::fromStdString(m_tokenABI->getPsbt()); + GUIUtil::setClipboard(psbt); + Q_EMIT message(tr("PSBT copied"), "Copied to clipboard", CClientUIInterface::MSG_INFORMATION); + } + else + { + interfaces::TokenTx tokenTx; + tokenTx.contract_address = m_selectedToken->address; + tokenTx.sender_address = m_selectedToken->sender; + tokenTx.receiver_address = toAddress; + dev::u256 nValue(amountToSend); + tokenTx.value = u256Touint(nValue); + tokenTx.tx_hash = uint256S(m_tokenABI->getTxId()); + tokenTx.label = label; + m_model->wallet().addTokenTxEntry(tokenTx); + } } else { diff --git a/src/qt/token.cpp b/src/qt/token.cpp index 9c4f5461f0..8ea7e5cf12 100755 --- a/src/qt/token.cpp +++ b/src/qt/token.cpp @@ -53,6 +53,7 @@ struct TokenData int evtBurn; std::string txid; + std::string psbt; QString errorMessage; TokenData(): @@ -266,6 +267,11 @@ std::string Token::getTxId() return d->txid; } +std::string Token::getPsbt() +{ + return d->psbt; +} + bool Token::name(std::string &result, bool sendTo) { std::vector input; @@ -526,6 +532,7 @@ bool Token::exec(const std::vector &input, int func, std::vectortxid = ""; + d->psbt = ""; if(func == -1 || d->model == 0) return false; std::string strData; @@ -569,7 +576,14 @@ bool Token::exec(const std::vector &input, int func, std::vectortxid = variantMap.value("txid").toString().toStdString(); + if(d->model->wallet().privateKeysDisabled()) + { + d->psbt = variantMap.value("psbt").toString().toStdString(); + } + else + { + d->txid = variantMap.value("txid").toString().toStdString(); + } } return true; diff --git a/src/qt/token.h b/src/qt/token.h index 4685ea9261..f7f8191b7e 100755 --- a/src/qt/token.h +++ b/src/qt/token.h @@ -49,6 +49,7 @@ class Token // Get transaction data std::string getTxId(); + std::string getPsbt(); std::string getErrorMessage(); // ABI Functions From 5bfab517da91f71412e88a70d65dddec84c007d3 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Wed, 10 Feb 2021 11:03:59 +0100 Subject: [PATCH 067/164] Add sign message in hwi tool wrapper --- src/qt/qtumhwitool.cpp | 46 ++++++++++++++++++++++++++++++++++++++++++ src/qt/qtumhwitool.h | 12 +++++++++++ 2 files changed, 58 insertions(+) diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 403a370a8d..96df50a38e 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -168,6 +168,20 @@ bool QtumHwiTool::signTx(const QString &fingerprint, QString &psbt) return endSignTx(fingerprint, psbt); } +bool QtumHwiTool::signMessage(const QString &fingerprint, const QString &message, const QString &path, QString &signature) +{ + // Sign message + if(isStarted()) + return false; + + if(!beginSignMessage(fingerprint, message, path, signature)) + return false; + + wait(); + + return endSignMessage(fingerprint, message, path, signature); +} + QString QtumHwiTool::errorMessage() { // Get the last error message @@ -255,6 +269,19 @@ bool QtumHwiTool::beginSignTx(const QString &fingerprint, QString &psbt) return d->fStarted; } +bool QtumHwiTool::beginSignMessage(const QString &fingerprint, const QString &message, const QString &path, QString &signature) +{ + Q_UNUSED(signature); + + // Execute command line + QStringList arguments = d->arguments; + arguments << "-f" << fingerprint << "signmessage" << message << path; + d->process.start(d->toolPath, arguments); + d->fStarted = true; + + return d->fStarted; +} + bool QtumHwiTool::endEnumerate(QList &devices) { // Decode command line results @@ -321,6 +348,25 @@ bool QtumHwiTool::endSignTx(const QString &fingerprint, QString &psbt) return false; } +bool QtumHwiTool::endSignMessage(const QString &fingerprint, const QString &message, const QString &path, QString &signature) +{ + Q_UNUSED(fingerprint); + Q_UNUSED(message); + Q_UNUSED(path); + + // Decode command line results + QJsonDocument jsonDocument = QJsonDocument::fromJson(d->strStdout.toUtf8()); + QVariantMap data = jsonDocument.object().toVariantMap(); + QString msgSigned = data["signature"].toString(); + if(!msgSigned.isEmpty()) + { + signature = msgSigned; + return true; + } + + return false; +} + bool QtumHwiTool::rescanBlockchain(int startHeight, int stopHeight) { if(!d->model) return false; diff --git a/src/qt/qtumhwitool.h b/src/qt/qtumhwitool.h index 871155f718..48eb7d0faf 100644 --- a/src/qt/qtumhwitool.h +++ b/src/qt/qtumhwitool.h @@ -176,6 +176,16 @@ class QtumHwiTool : public QObject */ bool signTx(const QString& fingerprint, QString& psbt); + /** + * @brief signMessage Sign message + * @param fingerprint Hardware wallet device fingerprint + * @param message Message to sign + * @param path HD key path + * @param signature Signature of the message + * @return success of the operation + */ + bool signMessage(const QString& fingerprint, const QString& message, const QString& path, QString& signature); + /** * @brief rescanBlockchain Rescan blockchain * @param startHeight Start height @@ -255,6 +265,8 @@ public Q_SLOTS: bool endEnumerate(QList& devices); bool endGetKeyPool(const QString& fingerprint, int type, QString& desc); bool endSignTx(const QString& fingerprint, QString& psbt); + bool beginSignMessage(const QString& fingerprint, const QString& message, const QString& path, QString& signature); + bool endSignMessage(const QString& fingerprint, const QString& message, const QString& path, QString& signature); bool execRPC(ExecRPCCommand* cmd, const QMap& lstParams, QVariant& result, QString& resultJson); void addError(const QString& error); From b6e7a33c4498b24563e8d22bb53ff129e8535969 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Wed, 10 Feb 2021 12:12:24 +0100 Subject: [PATCH 068/164] Add empty PoD signature for psbt --- src/wallet/rpcwallet.cpp | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 1522814228..269428ddb5 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -1579,6 +1579,7 @@ static UniValue setdelegateforaddress(const JSONRPCRequest& request){ UniValue gasLimit = request.params.size() > 3 ? request.params[3] : DEFAULT_GAS_LIMIT_OP_CREATE; UniValue gasPrice = request.params.size() > 4 ? request.params[4] : FormatMoney(nGasPrice); UniValue senderaddress = request.params[2]; + bool fPsbt=pwallet->IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS); // Parse the staker address CTxDestination destStaker = DecodeDestination(request.params[0].get_str()); @@ -1601,16 +1602,33 @@ static UniValue setdelegateforaddress(const JSONRPCRequest& request){ // Get the private key for the sender address CKey key; - CKeyID keyID(*pkhSender); - if (!spk_man.GetKey(keyID, key)) { - throw JSONRPCError(RPC_WALLET_ERROR, "Private key not available for the sender address"); + if(fPsbt) + { + if(!pwallet->IsMine(destSender)) { + throw JSONRPCError(RPC_WALLET_ERROR, "Sender address not mine"); + } + } + else + { + CKeyID keyID(*pkhSender); + if (!spk_man.GetKey(keyID, key)) { + throw JSONRPCError(RPC_WALLET_ERROR, "Private key not available for the sender address"); + } } // Sign the staker address std::vector PoD; std::string hexStaker = pkhStaker->GetReverseHex(); - if(!SignStr::SignMessage(key, hexStaker, PoD)) - throw JSONRPCError(RPC_WALLET_ERROR, "Fail to sign the staker address"); + if(fPsbt) + { + PoD.insert(PoD.end(), hexStaker.begin(), hexStaker.end()); + PoD.resize(CPubKey::COMPACT_SIGNATURE_SIZE, 0); + } + else + { + if(!SignStr::SignMessage(key, hexStaker, PoD)) + throw JSONRPCError(RPC_WALLET_ERROR, "Fail to sign the staker address"); + } // Serialize the data std::string datahex; From 1776aa48d5b5bb4ab82a284f29d8ef89fb863076 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 11 Feb 2021 12:13:50 +0100 Subject: [PATCH 069/164] Add has op_call to mutable transaction --- src/primitives/transaction.cpp | 15 +++++++++++++-- src/primitives/transaction.h | 2 ++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/primitives/transaction.cpp b/src/primitives/transaction.cpp index 6f04affbe6..416177e89c 100644 --- a/src/primitives/transaction.cpp +++ b/src/primitives/transaction.cpp @@ -149,9 +149,10 @@ bool CTransaction::HasOpCreate() const return false; } -bool CTransaction::HasOpCall() const +template +bool hasOpCall(const T& txTo) { - for(const CTxOut& v : vout){ + for(const CTxOut& v : txTo.vout){ if(v.scriptPubKey.HasOpCall()){ return true; } @@ -159,6 +160,16 @@ bool CTransaction::HasOpCall() const return false; } +bool CTransaction::HasOpCall() const +{ + return hasOpCall(*this); +} + +bool CMutableTransaction::HasOpCall() const +{ + return hasOpCall(*this); +} + template bool hasOpSender(const T& txTo) { diff --git a/src/primitives/transaction.h b/src/primitives/transaction.h index 22a1095fa2..b5be9e7c82 100644 --- a/src/primitives/transaction.h +++ b/src/primitives/transaction.h @@ -437,6 +437,8 @@ struct CMutableTransaction */ uint256 GetHash() const; + bool HasOpCall() const; + bool HasOpSender() const; bool HasWitness() const From 371337f0fa57ba73637a8f9441d88f3e743ac263 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 11 Feb 2021 12:15:33 +0100 Subject: [PATCH 070/164] Add methods for get and set contract data --- src/script/script.cpp | 58 +++++++++++++++++++++++++++++++++++++++++++ src/script/script.h | 5 ++++ 2 files changed, 63 insertions(+) diff --git a/src/script/script.cpp b/src/script/script.cpp index 9282eb3b7d..d55e2b54b1 100644 --- a/src/script/script.cpp +++ b/src/script/script.cpp @@ -391,6 +391,64 @@ bool CScript::ReplaceParam(opcodetype findOp, int posBefore, const std::vector &vchParam) const +{ + if(posBefore < 0) + return false; + + // Find parameter with opcode and return the parameter before + bool ret = false; + std::vector>> opcodes; + int minSize = posBefore + 1; + opcodetype opcode; + std::vector tmpParam; + for (const_iterator pc = begin(); pc != end() && GetOp(pc, opcode, tmpParam);) + { + opcodes.push_back(std::make_pair(pc, tmpParam)); + if (opcode == findOp) + { + int size = opcodes.size(); + if(size > minSize) + { + int position = size -1 -posBefore; + vchParam = opcodes[position].second; + ret = true; + } + break; + } + } + + return ret; +} + +bool CScript::GetData(std::vector &data) const +{ + if(HasOpCreate()) + { + return FindParam(OP_CREATE, 1, data); + } + else if(HasOpCall()) + { + return FindParam(OP_CALL, 2, data); + } + + return false; +} + +bool CScript::SetData(const std::vector &data, CScript &scriptRet) const +{ + if(HasOpCreate()) + { + return ReplaceParam(OP_CREATE, 1, data, scriptRet); + } + else if(HasOpCall()) + { + return ReplaceParam(OP_CALL, 2, data, scriptRet); + } + + return false; +} + bool CScript::IsPayToWitnessPubkeyHash() const { // Extra-fast test for pay-to-witness-pubkey-hash CScripts: diff --git a/src/script/script.h b/src/script/script.h index c96e36de2b..55159ac43e 100644 --- a/src/script/script.h +++ b/src/script/script.h @@ -644,6 +644,10 @@ class CScript : public CScriptBase return ReplaceParam(OP_SENDER, 1, scriptSig, scriptRet); } + bool GetData(std::vector& data) const; + + bool SetData(const std::vector& data, CScript& scriptRet) const; + CScript WithoutSenderSig() const { std::vector scriptSig; @@ -654,6 +658,7 @@ class CScript : public CScriptBase } bool ReplaceParam(opcodetype findOp, int posBefore, const std::vector& vchParam, CScript& scriptRet) const; + bool FindParam(opcodetype findOp, int posBefore, std::vector& vchParam) const; ///////////////////////////////////////// void clear() From bffb8b164ce2c6fb38f6b8b1d30adfcd3f213965 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 11 Feb 2021 12:17:44 +0100 Subject: [PATCH 071/164] Add sign delegate method --- src/qt/hardwaresigntxdialog.cpp | 3 ++- src/qt/qtumhwitool.cpp | 5 +++++ src/qt/qtumhwitool.h | 8 ++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/qt/hardwaresigntxdialog.cpp b/src/qt/hardwaresigntxdialog.cpp index afeda56ea4..b569e15a76 100644 --- a/src/qt/hardwaresigntxdialog.cpp +++ b/src/qt/hardwaresigntxdialog.cpp @@ -155,7 +155,8 @@ void HardwareSignTxDialog::on_signButton_clicked() QString psbt = d->psbt; d->hexTx = ""; d->complete = false; - bool ret = d->tool->signTx(fingerprint, psbt); + bool ret = d->tool->signDelegate(fingerprint, psbt); + if(ret) ret &= d->tool->signTx(fingerprint, psbt); if(ret) ret &= d->tool->finalizePsbt(psbt, d->hexTx, d->complete); if(d->complete) { diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 96df50a38e..e992a18fde 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -182,6 +182,11 @@ bool QtumHwiTool::signMessage(const QString &fingerprint, const QString &message return endSignMessage(fingerprint, message, path, signature); } +bool QtumHwiTool::signDelegate(const QString &fingerprint, QString &psbt) +{ + return true; +} + QString QtumHwiTool::errorMessage() { // Get the last error message diff --git a/src/qt/qtumhwitool.h b/src/qt/qtumhwitool.h index 48eb7d0faf..972ec43aa6 100644 --- a/src/qt/qtumhwitool.h +++ b/src/qt/qtumhwitool.h @@ -186,6 +186,14 @@ class QtumHwiTool : public QObject */ bool signMessage(const QString& fingerprint, const QString& message, const QString& path, QString& signature); + /** + * @brief signDelegate Sign delegate for psbt transaction + * @param fingerprint Hardware wallet device fingerprint + * @param psbt In/Out PSBT transaction + * @return success of the operation + */ + bool signDelegate(const QString& fingerprint, QString& psbt); + /** * @brief rescanBlockchain Rescan blockchain * @param startHeight Start height From c199ebba7d35ece0b8b2722d351b679dcc735b9e Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 11 Feb 2021 12:25:22 +0100 Subject: [PATCH 072/164] Add quick check for set address delegate contract method --- src/qtum/qtumdelegation.cpp | 11 +++++++++++ src/qtum/qtumdelegation.h | 7 +++++++ 2 files changed, 18 insertions(+) diff --git a/src/qtum/qtumdelegation.cpp b/src/qtum/qtumdelegation.cpp index 1494df6404..09cc25c537 100644 --- a/src/qtum/qtumdelegation.cpp +++ b/src/qtum/qtumdelegation.cpp @@ -395,3 +395,14 @@ bool QtumDelegation::BytecodeAdd(const std::string &hexStaker, const int &fee, c return true; } + +bool QtumDelegation::IsAddBytecode(const std::vector &data) +{ + // Quick check for is set delegate address + size_t size = data.size(); + if(size < 228) + return false; + if(data[0] != 76 || data[1] != 14 || data[2] != 150 || data[3] != 140 || data[131] != 65) + return false; + return true; +} diff --git a/src/qtum/qtumdelegation.h b/src/qtum/qtumdelegation.h index d044b8f956..2ecb640296 100644 --- a/src/qtum/qtumdelegation.h +++ b/src/qtum/qtumdelegation.h @@ -165,6 +165,13 @@ class QtumDelegation { */ static bool BytecodeAdd(const std::string& hexStaker, const int& fee, const std::vector& PoD, std::string& datahex, std::string& errorMessage); + /** + * @brief IsAddBytecode Quick check for if the bytecode is for addDelegation method + * @param data Bytecode of contract + * @return true/false + */ + static bool IsAddBytecode(const std::vector& data); + private: QtumDelegation(const QtumDelegation&); QtumDelegation& operator=(const QtumDelegation&); From 266deb9b444bf9a4f7fe1908411e24eec48c5d38 Mon Sep 17 00:00:00 2001 From: Toni Markov Date: Thu, 11 Feb 2021 12:38:03 +0100 Subject: [PATCH 073/164] Add psbt option in split utxo page --- src/qt/adddelegationpage.cpp | 12 +++++++----- src/qt/adddelegationpage.h | 1 + src/qt/createcontract.cpp | 12 +++++++----- src/qt/createcontract.h | 1 + src/qt/delegationpage.cpp | 1 + src/qt/removedelegationpage.cpp | 12 +++++++----- src/qt/removedelegationpage.h | 1 + src/qt/sendtocontract.cpp | 12 +++++++----- src/qt/sendtocontract.h | 1 + src/qt/sendtokenpage.cpp | 12 +++++++----- src/qt/sendtokenpage.h | 1 + src/qt/splitutxopage.cpp | 25 ++++++++++++++++++++++--- src/qt/splitutxopage.h | 5 +++++ src/qt/superstakerpage.cpp | 2 ++ src/qt/superstakerpage.h | 2 ++ src/qt/walletview.cpp | 2 ++ 16 files changed, 74 insertions(+), 28 deletions(-) diff --git a/src/qt/adddelegationpage.cpp b/src/qt/adddelegationpage.cpp index 80dd6b41f0..cf64a0654d 100644 --- a/src/qt/adddelegationpage.cpp +++ b/src/qt/adddelegationpage.cpp @@ -100,7 +100,9 @@ void AddDelegationPage::setModel(WalletModel *_model) // update the display unit, to not use the default ("QTUM") updateDisplayUnit(); - if (m_model->wallet().privateKeysDisabled()) { + bCreateUnsigned = m_model->wallet().privateKeysDisabled(); + + if (bCreateUnsigned) { ui->addDelegationButton->setText(tr("Cr&eate Unsigned")); ui->addDelegationButton->setToolTip(tr("Creates a Partially Signed Qtum Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); } @@ -250,7 +252,7 @@ void AddDelegationPage::on_addDelegationClicked() ExecRPCCommand::appendParam(lstParams, PARAM_GASPRICE, BitcoinUnits::format(unit, gasPrice, false, BitcoinUnits::separatorNever)); QString questionString; - if (m_model->wallet().privateKeysDisabled()) { + if (bCreateUnsigned) { questionString.append(tr("Do you want to draft this transaction?")); questionString.append("
"); questionString.append(tr("Please, review your transaction proposal. This will produce a Partially Signed Qtum Transaction (PSBT) which you can copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); @@ -264,8 +266,8 @@ void AddDelegationPage::on_addDelegationClicked() .arg(ui->lineEditStakerAddress->text())); } - const QString confirmation = m_model->wallet().privateKeysDisabled() ? tr("Confirm address delegation proposal.") : tr("Confirm address delegation to staker."); - const QString confirmButtonText = m_model->wallet().privateKeysDisabled() ? tr("Copy PSBT to clipboard") : tr("Send"); + const QString confirmation = bCreateUnsigned ? tr("Confirm address delegation proposal.") : tr("Confirm address delegation to staker."); + const QString confirmButtonText = bCreateUnsigned ? tr("Copy PSBT to clipboard") : tr("Send"); SendConfirmationDialog confirmationDialog(confirmation, questionString, "", "", SEND_CONFIRM_DELAY, confirmButtonText, this); confirmationDialog.exec(); @@ -281,7 +283,7 @@ void AddDelegationPage::on_addDelegationClicked() else { QVariantMap variantMap = result.toMap(); - if(m_model->wallet().privateKeysDisabled()) + if(bCreateUnsigned) { GUIUtil::setClipboard(variantMap.value("psbt").toString()); Q_EMIT message(tr("PSBT copied"), "Copied to clipboard", CClientUIInterface::MSG_INFORMATION); diff --git a/src/qt/adddelegationpage.h b/src/qt/adddelegationpage.h index fad1ec4d50..b2df84c519 100644 --- a/src/qt/adddelegationpage.h +++ b/src/qt/adddelegationpage.h @@ -44,6 +44,7 @@ private Q_SLOTS: WalletModel* m_model; ClientModel* m_clientModel; ExecRPCCommand *m_execRPCCommand; + bool bCreateUnsigned = false; }; #endif // ADDDELEGATIONPAGE_H diff --git a/src/qt/createcontract.cpp b/src/qt/createcontract.cpp index 00a271ab67..65889f7987 100644 --- a/src/qt/createcontract.cpp +++ b/src/qt/createcontract.cpp @@ -117,7 +117,9 @@ void CreateContract::setModel(WalletModel *_model) // update the display unit, to not use the default ("QTUM") updateDisplayUnit(); - if (m_model->wallet().privateKeysDisabled()) { + bCreateUnsigned = m_model->wallet().privateKeysDisabled(); + + if (bCreateUnsigned) { ui->pushButtonCreateContract->setText(tr("Cr&eate Unsigned")); ui->pushButtonCreateContract->setToolTip(tr("Creates a Partially Signed Qtum Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); } @@ -207,7 +209,7 @@ void CreateContract::on_createContractClicked() ExecRPCCommand::appendParam(lstParams, PARAM_SENDER, ui->lineEditSenderAddress->currentText()); QString questionString; - if (m_model->wallet().privateKeysDisabled()) { + if (bCreateUnsigned) { questionString.append(tr("Do you want to draft this create contract transaction?")); questionString.append("
"); questionString.append(tr("This will produce a Partially Signed Qtum Transaction (PSBT) which you can copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); @@ -216,8 +218,8 @@ void CreateContract::on_createContractClicked() questionString.append(tr("Are you sure you want to create contract?
")); } - const QString confirmation = m_model->wallet().privateKeysDisabled() ? tr("Confirm contract creation proposal.") : tr("Confirm contract creation."); - const QString confirmButtonText = m_model->wallet().privateKeysDisabled() ? tr("Copy PSBT to clipboard") : tr("Send"); + const QString confirmation = bCreateUnsigned ? tr("Confirm contract creation proposal.") : tr("Confirm contract creation."); + const QString confirmButtonText = bCreateUnsigned ? tr("Copy PSBT to clipboard") : tr("Send"); SendConfirmationDialog confirmationDialog(confirmation, questionString, "", "", SEND_CONFIRM_DELAY, confirmButtonText, this); confirmationDialog.exec(); QMessageBox::StandardButton retval = (QMessageBox::StandardButton)confirmationDialog.result(); @@ -226,7 +228,7 @@ void CreateContract::on_createContractClicked() // Execute RPC command line if(errorMessage.isEmpty() && m_execRPCCommand->exec(m_model->node(), m_model, lstParams, result, resultJson, errorMessage)) { - if(m_model->wallet().privateKeysDisabled()) + if(bCreateUnsigned) { QVariantMap variantMap = result.toMap(); GUIUtil::setClipboard(variantMap.value("psbt").toString()); diff --git a/src/qt/createcontract.h b/src/qt/createcontract.h index 7275e06f76..8545f07f40 100644 --- a/src/qt/createcontract.h +++ b/src/qt/createcontract.h @@ -56,6 +56,7 @@ private Q_SLOTS: ContractABI* m_contractABI; TabBarInfo* m_tabInfo; int m_results; + bool bCreateUnsigned = false; }; #endif // CREATECONTRACT_H diff --git a/src/qt/delegationpage.cpp b/src/qt/delegationpage.cpp index 377de40393..4560b1e305 100644 --- a/src/qt/delegationpage.cpp +++ b/src/qt/delegationpage.cpp @@ -54,6 +54,7 @@ DelegationPage::DelegationPage(const PlatformStyle *platformStyle, QWidget *pare connect(m_addDelegationPage, &AddDelegationPage::message, this, &DelegationPage::message); connect(m_removeDelegationPage, &RemoveDelegationPage::message, this, &DelegationPage::message); + connect(m_splitUtxoPage, &SplitUTXOPage::message, this, &DelegationPage::message); contextMenu = new QMenu(m_delegationList); contextMenu->addAction(copyStakerNameAction); diff --git a/src/qt/removedelegationpage.cpp b/src/qt/removedelegationpage.cpp index ce5d6dad21..c83db12b73 100644 --- a/src/qt/removedelegationpage.cpp +++ b/src/qt/removedelegationpage.cpp @@ -76,7 +76,9 @@ void RemoveDelegationPage::setModel(WalletModel *_model) // update the display unit, to not use the default ("QTUM") updateDisplayUnit(); - if (m_model->wallet().privateKeysDisabled()) { + bCreateUnsigned = m_model->wallet().privateKeysDisabled(); + + if (bCreateUnsigned) { ui->removeDelegationButton->setText(tr("Cr&eate Unsigned")); ui->removeDelegationButton->setToolTip(tr("Creates a Partially Signed Qtum Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); } @@ -212,7 +214,7 @@ void RemoveDelegationPage::on_removeDelegationClicked() ExecRPCCommand::appendParam(lstParams, PARAM_GASPRICE, BitcoinUnits::format(unit, gasPrice, false, BitcoinUnits::separatorNever)); QString questionString; - if (m_model->wallet().privateKeysDisabled()) { + if (bCreateUnsigned) { questionString.append(tr("Do you want to draft this transaction?")); questionString.append("
"); questionString.append(tr("Please, review your transaction proposal. This will produce a Partially Signed Qtum Transaction (PSBT) which you can copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); @@ -225,8 +227,8 @@ void RemoveDelegationPage::on_removeDelegationClicked() questionString.append(tr("%1?") .arg(ui->lineEditAddress->text())); - const QString confirmation = m_model->wallet().privateKeysDisabled() ? tr("Confirm remove delegation proposal.") : tr("Confirm remove delegation."); - const QString confirmButtonText = m_model->wallet().privateKeysDisabled() ? tr("Copy PSBT to clipboard") : tr("Send"); + const QString confirmation = bCreateUnsigned ? tr("Confirm remove delegation proposal.") : tr("Confirm remove delegation."); + const QString confirmButtonText = bCreateUnsigned ? tr("Copy PSBT to clipboard") : tr("Send"); SendConfirmationDialog confirmationDialog(confirmation, questionString, "", "", SEND_CONFIRM_DELAY, confirmButtonText, this); confirmationDialog.exec(); @@ -241,7 +243,7 @@ void RemoveDelegationPage::on_removeDelegationClicked() else { QVariantMap variantMap = result.toMap(); - if(m_model->wallet().privateKeysDisabled()) + if(bCreateUnsigned) { QVariantMap variantMap = result.toMap(); GUIUtil::setClipboard(variantMap.value("psbt").toString()); diff --git a/src/qt/removedelegationpage.h b/src/qt/removedelegationpage.h index 570cdaff06..26b2e546d1 100644 --- a/src/qt/removedelegationpage.h +++ b/src/qt/removedelegationpage.h @@ -46,6 +46,7 @@ private Q_SLOTS: ExecRPCCommand *m_execRPCCommand; QString address; QString hash; + bool bCreateUnsigned = false; }; #endif // REMOVEDELEGATIONPAGE_H diff --git a/src/qt/sendtocontract.cpp b/src/qt/sendtocontract.cpp index 2bd5fc90d2..5e4ad424ac 100644 --- a/src/qt/sendtocontract.cpp +++ b/src/qt/sendtocontract.cpp @@ -141,7 +141,9 @@ void SendToContract::setModel(WalletModel *_model) // update the display unit, to not use the default ("QTUM") updateDisplayUnit(); - if (m_model->wallet().privateKeysDisabled()) { + bCreateUnsigned = m_model->wallet().privateKeysDisabled(); + + if (bCreateUnsigned) { ui->pushButtonSendToContract->setText(tr("Cr&eate Unsigned")); ui->pushButtonSendToContract->setToolTip(tr("Creates a Partially Signed Qtum Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); } @@ -239,7 +241,7 @@ void SendToContract::on_sendToContractClicked() ExecRPCCommand::appendParam(lstParams, PARAM_SENDER, ui->lineEditSenderAddress->currentText()); QString questionString; - if (m_model->wallet().privateKeysDisabled()) { + if (bCreateUnsigned) { questionString.append(tr("Do you want to draft this transaction?")); questionString.append("
"); questionString.append(tr("Please, review your transaction proposal. This will produce a Partially Signed Qtum Transaction (PSBT) which you can copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); @@ -251,8 +253,8 @@ void SendToContract::on_sendToContractClicked() questionString.append(tr("%1?") .arg(ui->lineEditContractAddress->text())); - const QString confirmation = m_model->wallet().privateKeysDisabled() ? tr("Confirm sending to contract proposal.") : tr("Confirm sending to contract."); - const QString confirmButtonText = m_model->wallet().privateKeysDisabled() ? tr("Copy PSBT to clipboard") : tr("Send"); + const QString confirmation = bCreateUnsigned ? tr("Confirm sending to contract proposal.") : tr("Confirm sending to contract."); + const QString confirmButtonText = bCreateUnsigned ? tr("Copy PSBT to clipboard") : tr("Send"); SendConfirmationDialog confirmationDialog(confirmation, questionString, "", "", SEND_CONFIRM_DELAY, confirmButtonText, this); confirmationDialog.exec(); QMessageBox::StandardButton retval = (QMessageBox::StandardButton)confirmationDialog.result(); @@ -261,7 +263,7 @@ void SendToContract::on_sendToContractClicked() // Execute RPC command line if(errorMessage.isEmpty() && m_execRPCCommand->exec(m_model->node(), m_model, lstParams, result, resultJson, errorMessage)) { - if(m_model->wallet().privateKeysDisabled()) + if(bCreateUnsigned) { QVariantMap variantMap = result.toMap(); GUIUtil::setClipboard(variantMap.value("psbt").toString()); diff --git a/src/qt/sendtocontract.h b/src/qt/sendtocontract.h index a4180ec990..59132675d6 100644 --- a/src/qt/sendtocontract.h +++ b/src/qt/sendtocontract.h @@ -65,6 +65,7 @@ private Q_SLOTS: TabBarInfo* m_tabInfo; const PlatformStyle* m_platformStyle; int m_results; + bool bCreateUnsigned = false; }; #endif // SENDTOCONTRACT_H diff --git a/src/qt/sendtokenpage.cpp b/src/qt/sendtokenpage.cpp index fd5613655f..83ebffb8f1 100644 --- a/src/qt/sendtokenpage.cpp +++ b/src/qt/sendtokenpage.cpp @@ -86,7 +86,9 @@ void SendTokenPage::setModel(WalletModel *_model) // update the display unit, to not use the default ("QTUM") updateDisplayUnit(); - if (m_model->wallet().privateKeysDisabled()) { + bCreateUnsigned = m_model->wallet().privateKeysDisabled(); + + if (bCreateUnsigned) { ui->confirmButton->setText(tr("Cr&eate Unsigned")); ui->confirmButton->setToolTip(tr("Creates a Partially Signed Qtum Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); } @@ -187,7 +189,7 @@ void SendTokenPage::on_confirmClicked() QString amountFormated = BitcoinUnits::formatToken(m_selectedToken->decimals, ui->lineEditAmount->value(), false, BitcoinUnits::separatorAlways); QString questionString; - if (m_model->wallet().privateKeysDisabled()) { + if (bCreateUnsigned) { questionString.append(tr("Do you want to draft this send token transaction?")); questionString.append("
"); questionString.append(tr("Please, review your transaction proposal. This will produce a Partially Signed Qtum Transaction (PSBT) which you can copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); @@ -200,8 +202,8 @@ void SendTokenPage::on_confirmClicked() questionString.append(tr("
%3
") .arg(QString::fromStdString(toAddress))); - const QString confirmation = m_model->wallet().privateKeysDisabled() ? tr("Confirm send token proposal.") : tr("Confirm send token."); - const QString confirmButtonText = m_model->wallet().privateKeysDisabled() ? tr("Copy PSBT to clipboard") : tr("Send"); + const QString confirmation = bCreateUnsigned ? tr("Confirm send token proposal.") : tr("Confirm send token."); + const QString confirmButtonText = bCreateUnsigned ? tr("Copy PSBT to clipboard") : tr("Send"); SendConfirmationDialog confirmationDialog(confirmation, questionString, "", "", SEND_CONFIRM_DELAY, confirmButtonText, this); confirmationDialog.exec(); QMessageBox::StandardButton retval = (QMessageBox::StandardButton)confirmationDialog.result(); @@ -209,7 +211,7 @@ void SendTokenPage::on_confirmClicked() { if(m_tokenABI->transfer(toAddress, amountToSend, true)) { - if(m_model->wallet().privateKeysDisabled()) + if(bCreateUnsigned) { QString psbt = QString::fromStdString(m_tokenABI->getPsbt()); GUIUtil::setClipboard(psbt); diff --git a/src/qt/sendtokenpage.h b/src/qt/sendtokenpage.h index 830477fb25..6066eab32d 100644 --- a/src/qt/sendtokenpage.h +++ b/src/qt/sendtokenpage.h @@ -45,6 +45,7 @@ private Q_SLOTS: ClientModel* m_clientModel; Token *m_tokenABI; SelectedToken *m_selectedToken; + bool bCreateUnsigned = false; }; #endif // SENDTOKENPAGE_H diff --git a/src/qt/splitutxopage.cpp b/src/qt/splitutxopage.cpp index 26e86e5e85..4899890ad7 100644 --- a/src/qt/splitutxopage.cpp +++ b/src/qt/splitutxopage.cpp @@ -108,6 +108,13 @@ void SplitUTXOPage::setModel(WalletModel *_model) // update the display unit, to not use the default ("QTUM") updateDisplayUnit(); + + bCreateUnsigned = m_model->wallet().privateKeysDisabled(); + + if (bCreateUnsigned) { + ui->splitCoinsButton->setText(tr("Cr&eate Unsigned")); + ui->splitCoinsButton->setToolTip(tr("Creates a Partially Signed Qtum Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); + } } void SplitUTXOPage::setAddress(const QString &address) @@ -211,11 +218,23 @@ void SplitUTXOPage::on_splitCoinsClicked() ExecRPCCommand::appendParam(lstParams, PARAM_MAX_VALUE, BitcoinUnits::format(unit, maxValue, false, BitcoinUnits::separatorNever)); ExecRPCCommand::appendParam(lstParams, PARAM_MAX_OUTPUTS, QString::number(maxOutputs)); - QString questionString = tr("Are you sure you want to split coins for address"); - questionString.append(QString("

%1?") + QString questionString; + if (bCreateUnsigned) { + questionString.append(tr("Do you want to draft this create contract transaction?")); + questionString.append("
"); + questionString.append(tr("Please, review your transaction proposal. This will produce a Partially Signed Qtum Transaction (PSBT) which you can copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); + questionString.append(""); + questionString.append(tr("

Split coins for address:
")); + } else { + questionString.append(tr("Are you sure you want to split coins for address

")); + } + questionString.append(QString("%1?") .arg(address)); - SendConfirmationDialog confirmationDialog(tr("Confirm splitting coins for address."), questionString, "", "", SEND_CONFIRM_DELAY, tr("Send"), this); + const QString confirmation = bCreateUnsigned ? tr("Confirm splitting coins for address proposal.") : tr("Confirm splitting coins for address."); + const QString confirmButtonText = bCreateUnsigned ? tr("Copy PSBT to clipboard") : tr("Send"); + SendConfirmationDialog confirmationDialog(confirmation, questionString, "", "", SEND_CONFIRM_DELAY, confirmButtonText, this); + confirmationDialog.exec(); QMessageBox::StandardButton retval = (QMessageBox::StandardButton)confirmationDialog.result(); diff --git a/src/qt/splitutxopage.h b/src/qt/splitutxopage.h index d16d69e440..e0c2477dad 100644 --- a/src/qt/splitutxopage.h +++ b/src/qt/splitutxopage.h @@ -29,6 +29,10 @@ class SplitUTXOPage : public QDialog bool isDataValid(); void clearAll(); +Q_SIGNALS: + // Fired when a message should be reported to the user + void message(const QString &title, const QString &message, unsigned int style); + public Q_SLOTS: void accept(); void reject(); @@ -44,6 +48,7 @@ private Q_SLOTS: WalletModel* m_model; ExecRPCCommand *m_execRPCCommand; Mode m_mode; + bool bCreateUnsigned = false; }; #endif // SPLITUTXOPAGE_H diff --git a/src/qt/superstakerpage.cpp b/src/qt/superstakerpage.cpp index 247bfdbc84..6aa125f5dc 100644 --- a/src/qt/superstakerpage.cpp +++ b/src/qt/superstakerpage.cpp @@ -57,6 +57,8 @@ SuperStakerPage::SuperStakerPage(const PlatformStyle *platformStyle, QWidget *pa connect(m_superStakerList, &SuperStakerListWidget::splitCoins, this, &SuperStakerPage::on_splitCoins); connect(m_superStakerList, &SuperStakerListWidget::restoreSuperStakers, this, &SuperStakerPage::on_restoreSuperStakers); + connect(m_splitUtxoPage, &SplitUTXOPage::message, this, &SuperStakerPage::message); + contextMenu = new QMenu(m_superStakerList); contextMenu->addAction(copyStakerNameAction); contextMenu->addAction(copyStakerAddressAction); diff --git a/src/qt/superstakerpage.h b/src/qt/superstakerpage.h index ef2140669c..7f84d634fd 100644 --- a/src/qt/superstakerpage.h +++ b/src/qt/superstakerpage.h @@ -32,6 +32,8 @@ class SuperStakerPage : public QWidget void setClientModel(ClientModel *clientModel); Q_SIGNALS: + // Fired when a message should be reported to the user + void message(const QString &title, const QString &message, unsigned int style); public Q_SLOTS: void on_goToSplitCoinsPage(); diff --git a/src/qt/walletview.cpp b/src/qt/walletview.cpp index 5ce71b1543..a9a16363ab 100644 --- a/src/qt/walletview.cpp +++ b/src/qt/walletview.cpp @@ -124,6 +124,8 @@ WalletView::WalletView(const PlatformStyle *_platformStyle, QWidget *parent): connect(QRCTokenPage, &QRCToken::message, this, &WalletView::message); // Pass through messages from delegationPage connect(delegationPage, &DelegationPage::message, this, &WalletView::message); + // Pass through messages from superStakerPage + connect(superStakerPage, &SuperStakerPage::message, this, &WalletView::message); } From ab73e9c0660662a615315379600af513d63feed3 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 11 Feb 2021 13:25:07 +0100 Subject: [PATCH 074/164] Move GetSenderDest to wallet --- src/wallet/rpcwallet.cpp | 39 ++------------------------------------- src/wallet/wallet.cpp | 35 +++++++++++++++++++++++++++++++++++ src/wallet/wallet.h | 1 + 3 files changed, 38 insertions(+), 37 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 269428ddb5..fdb039053c 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -102,41 +102,6 @@ std::shared_ptr GetWalletForJSONRPCRequest(const JSONRPCRequest& reques return wallets.size() == 1 || (request.fHelp && wallets.size() > 0) ? wallets[0] : nullptr; } -bool GetSenderDest(CWallet * const pwallet, const CTransactionRef& tx, CTxDestination& txSenderDest, bool sign=true) -{ - // Initialize variables - CScript senderPubKey; - - // Get sender destination - if(tx->HasOpSender()) - { - // Get destination from the outputs - for(CTxOut out : tx->vout) - { - if(out.scriptPubKey.HasOpSender()) - { - if(sign) - { - ExtractSenderData(out.scriptPubKey, &senderPubKey, 0); - } - else - { - GetSenderPubKey(out.scriptPubKey, senderPubKey); - } - break; - } - } - } - else - { - // Get destination from the inputs - senderPubKey = pwallet->mapWallet.at(tx->vin[0].prevout.hash).tx->vout[tx->vin[0].prevout.n].scriptPubKey; - } - - // Extract destination from script - return ExtractDestination(senderPubKey, txSenderDest); -} - bool EnsureWalletIsAvailable(const CWallet* pwallet, bool avoidException) { if (pwallet) return true; @@ -1098,7 +1063,7 @@ static UniValue createcontract(const JSONRPCRequest& request){ } CTxDestination txSenderDest; - GetSenderDest(pwallet, tx, txSenderDest, sign); + pwallet->GetSenderDest(*tx, txSenderDest, sign); if (fHasSender && !(senderAddress == txSenderDest)){ throw JSONRPCError(RPC_TYPE_ERROR, "Sender could not be set, transaction was not committed!"); @@ -1364,7 +1329,7 @@ UniValue SendToContract(interfaces::Chain::Lock& locked_chain, CWallet* const pw } CTxDestination txSenderDest; - GetSenderDest(pwallet, tx, txSenderDest, sign); + pwallet->GetSenderDest(*tx, txSenderDest, sign); if (fHasSender && !(senderAddress == txSenderDest)){ throw JSONRPCError(RPC_TYPE_ERROR, "Sender could not be set, transaction was not committed!"); diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 5355df4b54..07b18dd381 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -6323,3 +6323,38 @@ void CWallet::SelectAddress(interfaces::Chain::Lock &locked_chain, std::mapvout[tx.vin[0].prevout.n].scriptPubKey; + } + + // Extract destination from script + return ExtractDestination(senderPubKey, txSenderDest); +} diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index 5f0f03339e..74d3748742 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -1072,6 +1072,7 @@ class CWallet final : public WalletStorage, public interfaces::Chain::Notificati bool CreateCoinStake(interfaces::Chain::Lock& locked_chain, const FillableSigningProvider &keystore, unsigned int nBits, const CAmount& nTotalFees, uint32_t nTimeBlock, CMutableTransaction& tx, CKey& key, std::set >& setCoins, std::vector& setSelectedCoins, std::vector& setDelegateCoins, bool selectedOnly, std::vector& vchPoD, COutPoint& headerPrevout); bool CanSuperStake(const std::set >& setCoins, const std::vector& setDelegateCoins) const; void UpdateMinerStakeCache(bool fStakeCache, const std::vector& prevouts, CBlockIndex* pindexPrev); + bool GetSenderDest(const CTransaction& tx, CTxDestination& txSenderDest, bool sign=true) const; bool DummySignTx(CMutableTransaction &txNew, const std::set &txouts, bool use_max_sig = false) const { From 4c6d3dd440173be58caf5535cc722178e3f6eccf Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 11 Feb 2021 15:08:42 +0100 Subject: [PATCH 075/164] Update sign delegate --- src/interfaces/wallet.cpp | 8 ++++++++ src/interfaces/wallet.h | 15 +++++++++++++++ src/qt/qtumhwitool.cpp | 39 +++++++++++++++++++++++++++++++++++++++ src/wallet/wallet.cpp | 5 ++++- 4 files changed, 66 insertions(+), 1 deletion(-) diff --git a/src/interfaces/wallet.cpp b/src/interfaces/wallet.cpp index 81be316a59..3fc4e66656 100644 --- a/src/interfaces/wallet.cpp +++ b/src/interfaces/wallet.cpp @@ -1348,6 +1348,14 @@ class WalletImpl : public Wallet return keyID != 0; } + bool getAddDelegationData(const std::string& psbt, std::map& signData, std::string& error) override + { + return true; + } + bool setAddDelegationData(std::string& psbt, const std::map& signData, std::string& error) override + { + return true; + } std::unique_ptr handleUnload(UnloadFn fn) override { return MakeHandler(m_wallet->NotifyUnload.connect(fn)); diff --git a/src/interfaces/wallet.h b/src/interfaces/wallet.h index 7eaf0da869..58dee3bfe6 100644 --- a/src/interfaces/wallet.h +++ b/src/interfaces/wallet.h @@ -48,6 +48,7 @@ struct DelegationInfo; struct DelegationDetails; struct SuperStakerInfo; struct DelegationStakerInfo; +struct SignDelegation; using WalletOrderForm = std::vector>; @@ -427,6 +428,12 @@ class Wallet //! Get staker address balance. virtual bool getStakerAddressBalance(const std::string& staker, CAmount& balance, CAmount& stake, CAmount& weight) = 0; + //! Get add delegation data to sign. + virtual bool getAddDelegationData(const std::string& psbt, std::map& signData, std::string& error) = 0; + + //! Set signed add delegation data. + virtual bool setAddDelegationData(std::string& psbt, const std::map& signData, std::string& error) = 0; + //! Register handler for unload message. using UnloadFn = std::function; virtual std::unique_ptr handleUnload(UnloadFn fn) = 0; @@ -709,6 +716,14 @@ struct DelegationStakerInfo uint160 hash; }; +// Sign PoD wallet delegation data. +struct SignDelegation +{ + std::string delegate; + std::string staker; + std::string PoD; +}; + //! Return implementation of Wallet interface. This function is defined in //! dummywallet.cpp and throws if the wallet component is not compiled. std::unique_ptr MakeWallet(const std::shared_ptr& wallet); diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index e992a18fde..74045a753f 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -184,6 +184,45 @@ bool QtumHwiTool::signMessage(const QString &fingerprint, const QString &message bool QtumHwiTool::signDelegate(const QString &fingerprint, QString &psbt) { + if(!d->model) return false; + + // Get the delegation data to sign + std::string strPsbt = psbt.toStdString(); + std::map signData; + std::string strError; + if(d->model->wallet().getAddDelegationData(strPsbt, signData, strError) == false) + { + d->strError = QString::fromStdString(strError); + return false; + } + + // Sign the delegation data + for (std::map::iterator it = signData.begin(); it != signData.end(); it++) + { + QString message = QString::fromStdString(it->second.staker); + QString path = QString::fromStdString(it->second.delegate); + QString signature; + if(signMessage(fingerprint, message, path, signature)) + { + it->second.PoD = signature.toStdString(); + } + else + { + return false; + } + } + + // Update the transaction + if(signData.size() > 0) + { + if(d->model->wallet().setAddDelegationData(strPsbt, signData, strError) == false) + { + d->strError = QString::fromStdString(strError); + return false; + } + psbt = QString::fromStdString(strPsbt); + } + return true; } diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 07b18dd381..496f5d379a 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -6352,7 +6352,10 @@ bool CWallet::GetSenderDest(const CTransaction &tx, CTxDestination &txSenderDest else { // Get destination from the inputs - senderPubKey = mapWallet.at(tx.vin[0].prevout.hash).tx->vout[tx.vin[0].prevout.n].scriptPubKey; + if(tx.vin.size() > 0 && mapWallet.find(tx.vin[0].prevout.hash) != mapWallet.end()) + { + senderPubKey = mapWallet.at(tx.vin[0].prevout.hash).tx->vout[tx.vin[0].prevout.n].scriptPubKey; + } } // Extract destination from script From b6b9c2bca2a9d7dbbcf8447b4b1c3789c24100b2 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 12 Feb 2021 09:25:36 +0100 Subject: [PATCH 076/164] Add method for to get unsigned staker --- src/qtum/qtumdelegation.cpp | 43 ++++++++++++++++++++++++++++++++++++- src/qtum/qtumdelegation.h | 8 +++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/qtum/qtumdelegation.cpp b/src/qtum/qtumdelegation.cpp index 09cc25c537..b9ef9782c1 100644 --- a/src/qtum/qtumdelegation.cpp +++ b/src/qtum/qtumdelegation.cpp @@ -9,6 +9,7 @@ const std::string strDelegationsABI = "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_staker\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_delegate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"fee\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"blockHeight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"PoD\",\"type\":\"bytes\"}],\"name\":\"AddDelegation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_staker\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_delegate\",\"type\":\"address\"}],\"name\":\"RemoveDelegation\",\"type\":\"event\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_staker\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"_fee\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"_PoD\",\"type\":\"bytes\"}],\"name\":\"addDelegation\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"delegations\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"fee\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"blockHeight\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"PoD\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"removeDelegation\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]"; const ContractABI contractDelegationABI = strDelegationsABI; +const size_t nPoDStartPosition = 131; const ContractABI &DelegationABI() { @@ -402,7 +403,47 @@ bool QtumDelegation::IsAddBytecode(const std::vector &data) size_t size = data.size(); if(size < 228) return false; - if(data[0] != 76 || data[1] != 14 || data[2] != 150 || data[3] != 140 || data[131] != 65) + if(data[0] != 76 || data[1] != 14 || data[2] != 150 || data[3] != 140 || data[nPoDStartPosition] != CPubKey::COMPACT_SIGNATURE_SIZE) return false; return true; } + +bool QtumDelegation::GetUnsignedStaker(const std::vector &data, std::string &hexStaker) +{ + if(!IsAddBytecode(data)) + return false; + + // Init variables + size_t from = nPoDStartPosition + 1; + size_t to = from + CPubKey::COMPACT_SIGNATURE_SIZE; + size_t stakerSize = 40; + size_t remainSize = CPubKey::COMPACT_SIGNATURE_SIZE - stakerSize; + std::string strStaker; + std::string strRemain; + + strStaker.reserve(stakerSize); + strRemain.reserve(remainSize); + + // Get unsigned staker address from PoD + for(size_t i = from; i < to; i++) + { + char c = (char)data[i]; + if(strStaker.size() < stakerSize) + { + strStaker.push_back(c); + } + else + { + strRemain.push_back(c); + } + } + + // Check formatting + if(IsHex(strStaker) && !IsHex(strRemain)) + { + hexStaker = strStaker; + return true; + } + + return false; +} diff --git a/src/qtum/qtumdelegation.h b/src/qtum/qtumdelegation.h index 2ecb640296..1f08dcaa9a 100644 --- a/src/qtum/qtumdelegation.h +++ b/src/qtum/qtumdelegation.h @@ -172,6 +172,14 @@ class QtumDelegation { */ static bool IsAddBytecode(const std::vector& data); + /** + * @brief GetUnsignedStaker Get unsigned staker address from PoD + * @param data Bytecode of contract + * @param hexStaker Staker hex address + * @return true/false + */ + static bool GetUnsignedStaker(const std::vector& data, std::string& hexStaker); + private: QtumDelegation(const QtumDelegation&); QtumDelegation& operator=(const QtumDelegation&); From 53851a9eef62409a4af877918ec99aac38e89b04 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 12 Feb 2021 10:11:59 +0100 Subject: [PATCH 077/164] Add method to set signed staker --- src/qtum/qtumdelegation.cpp | 19 +++++++++++++++++++ src/qtum/qtumdelegation.h | 8 ++++++++ 2 files changed, 27 insertions(+) diff --git a/src/qtum/qtumdelegation.cpp b/src/qtum/qtumdelegation.cpp index b9ef9782c1..9f824234d1 100644 --- a/src/qtum/qtumdelegation.cpp +++ b/src/qtum/qtumdelegation.cpp @@ -447,3 +447,22 @@ bool QtumDelegation::GetUnsignedStaker(const std::vector &data, s return false; } + +bool QtumDelegation::SetSignedStaker(std::vector &data, const std::string &base64PoD) +{ + if(!IsAddBytecode(data)) + return false; + + bool invalid = false; + std::string strPoD = DecodeBase64(base64PoD, &invalid); + if(invalid || strPoD.size() < CPubKey::COMPACT_SIGNATURE_SIZE) + return false; + + size_t offset = nPoDStartPosition + 1; + for(size_t i = 0; i < CPubKey::COMPACT_SIGNATURE_SIZE; i++) + { + data[offset + i] = strPoD[i]; + } + + return true; +} diff --git a/src/qtum/qtumdelegation.h b/src/qtum/qtumdelegation.h index 1f08dcaa9a..0cdde1a1bb 100644 --- a/src/qtum/qtumdelegation.h +++ b/src/qtum/qtumdelegation.h @@ -180,6 +180,14 @@ class QtumDelegation { */ static bool GetUnsignedStaker(const std::vector& data, std::string& hexStaker); + /** + * @brief SetSignedStaker Set signed staker address into PoD + * @param data Bytecode of contract + * @param base64PoD Staker address signed in base64 + * @return true/false + */ + static bool SetSignedStaker(std::vector& data, const std::string& base64PoD); + private: QtumDelegation(const QtumDelegation&); QtumDelegation& operator=(const QtumDelegation&); From 9c5fcf5199f94f2d798223166aec3ddd3e7b5685 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 12 Feb 2021 10:37:31 +0100 Subject: [PATCH 078/164] Add method to get key path --- src/wallet/wallet.cpp | 16 ++++++++++++++++ src/wallet/wallet.h | 1 + 2 files changed, 17 insertions(+) diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 496f5d379a..722b6b287e 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -6361,3 +6361,19 @@ bool CWallet::GetSenderDest(const CTransaction &tx, CTxDestination &txSenderDest // Extract destination from script return ExtractDestination(senderPubKey, txSenderDest); } + +bool CWallet::GetHDKeyPath(const CTxDestination &dest, std::string &hdkeypath) const +{ + CScript scriptPubKey = GetScriptForDestination(dest); + ScriptPubKeyMan* spk_man = GetScriptPubKeyMan(scriptPubKey); + if (spk_man) { + if (const CKeyMetadata* meta = spk_man->GetMetadata(dest)) { + if (meta->has_key_origin) { + hdkeypath = WriteHDKeypath(meta->key_origin.path); + return true; + } + } + } + + return false; +} diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index 74d3748742..0c736ee445 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -1073,6 +1073,7 @@ class CWallet final : public WalletStorage, public interfaces::Chain::Notificati bool CanSuperStake(const std::set >& setCoins, const std::vector& setDelegateCoins) const; void UpdateMinerStakeCache(bool fStakeCache, const std::vector& prevouts, CBlockIndex* pindexPrev); bool GetSenderDest(const CTransaction& tx, CTxDestination& txSenderDest, bool sign=true) const; + bool GetHDKeyPath(const CTxDestination& dest, std::string& hdkeypath) const; bool DummySignTx(CMutableTransaction &txNew, const std::set &txouts, bool use_max_sig = false) const { From 6f222dd74c58659d835c5b931f1620b40e37b54a Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 12 Feb 2021 11:35:45 +0100 Subject: [PATCH 079/164] Update getting data for add delegation --- src/interfaces/wallet.cpp | 63 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/src/interfaces/wallet.cpp b/src/interfaces/wallet.cpp index 3fc4e66656..26c9eb1519 100644 --- a/src/interfaces/wallet.cpp +++ b/src/interfaces/wallet.cpp @@ -1350,6 +1350,69 @@ class WalletImpl : public Wallet } bool getAddDelegationData(const std::string& psbt, std::map& signData, std::string& error) override { + auto locked_chain = m_wallet->chain().lock(); + LOCK(m_wallet->cs_wallet); + + try + { + // Decode transaction + PartiallySignedTransaction decoded_psbt; + if(!DecodeBase64PSBT(decoded_psbt, psbt, error)) + { + error = "Fail to decode PSBT transaction"; + return false; + } + + if(decoded_psbt.tx->HasOpCall()) + { + // Get sender destination + CTransaction tx(*(decoded_psbt.tx)); + CTxDestination txSenderDest; + if(m_wallet->GetSenderDest(tx, txSenderDest, false) == false) + { + error = "Fail to get sender destination"; + return false; + } + + // Get sender HD path + std::string strSender; + if(m_wallet->GetHDKeyPath(txSenderDest, strSender) == false) + { + error = "Fail to get HD key path for sender"; + return false; + } + + // Get unsigned staker + for(size_t i = 0; i < decoded_psbt.tx->vout.size(); i++){ + CTxOut v = decoded_psbt.tx->vout[i]; + if(v.scriptPubKey.HasOpCall()){ + std::vector data; + v.scriptPubKey.GetData(data); + if(QtumDelegation::IsAddBytecode(data)) + { + std::string hexStaker; + if(!QtumDelegation::GetUnsignedStaker(data, hexStaker)) + { + error = "Fail to get unsigned staker"; + return false; + } + + // Set data to sign + SignDelegation signDeleg; + signDeleg.delegate = strSender; + signDeleg.staker = hexStaker; + signData[i] = signDeleg; + } + } + } + } + } + catch(...) + { + error = "Unknown error happen"; + return false; + } + return true; } bool setAddDelegationData(std::string& psbt, const std::map& signData, std::string& error) override From a2e2fc0b7d782712b0b454cec4cd63687356c646 Mon Sep 17 00:00:00 2001 From: Toni Markov Date: Fri, 12 Feb 2021 12:03:23 +0100 Subject: [PATCH 080/164] Add sign psbt with hwi tool option --- src/qt/forms/optionsdialog.ui | 7 +++++++ src/qt/optionsdialog.cpp | 3 +++ src/qt/optionsmodel.cpp | 14 ++++++++++++++ src/qt/optionsmodel.h | 1 + src/wallet/init.cpp | 1 + src/wallet/wallet.h | 3 +++ 6 files changed, 29 insertions(+) diff --git a/src/qt/forms/optionsdialog.ui b/src/qt/forms/optionsdialog.ui index 302b9b90a9..b9ef0f93a2 100644 --- a/src/qt/forms/optionsdialog.ui +++ b/src/qt/forms/optionsdialog.ui @@ -371,6 +371,13 @@ + + + + Sign PSBT with HWI tool + + + diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp index a8a0983e95..2025200a1b 100644 --- a/src/qt/optionsdialog.cpp +++ b/src/qt/optionsdialog.cpp @@ -108,6 +108,7 @@ OptionsDialog::OptionsDialog(QWidget *parent, bool enableWallet) : ui->txtHWIToolPath->setVisible(fHasHardwareWalletSupport); ui->toolHWIPath->setVisible(fHasHardwareWalletSupport); ui->HWIToolLabel->setVisible(fHasHardwareWalletSupport); + ui->signPSBTHWITool->setVisible(fHasHardwareWalletSupport); } /* Display elements init */ @@ -224,6 +225,7 @@ void OptionsDialog::setModel(OptionsModel *_model) /* Wallet */ connect(ui->spendZeroConfChange, &QCheckBox::clicked, this, &OptionsDialog::showRestartWarning); connect(ui->useChangeAddress, &QCheckBox::clicked, this, &OptionsDialog::showRestartWarning); + connect(ui->signPSBTHWITool, &QCheckBox::clicked, this, &OptionsDialog::showRestartWarning); /* Network */ connect(ui->allowIncoming, &QCheckBox::clicked, this, &OptionsDialog::showRestartWarning); connect(ui->connectSocks, &QCheckBox::clicked, this, &OptionsDialog::showRestartWarning); @@ -263,6 +265,7 @@ void OptionsDialog::setMapper() mapper->addMapping(ui->zeroBalanceAddressToken, OptionsModel::ZeroBalanceAddressToken); mapper->addMapping(ui->useChangeAddress, OptionsModel::UseChangeAddress); mapper->addMapping(ui->checkForUpdates, OptionsModel::CheckForUpdates); + mapper->addMapping(ui->signPSBTHWITool, OptionsModel::SignPSBTWithHWITool); /* Network */ mapper->addMapping(ui->mapPortUpnp, OptionsModel::MapPortUPnP); diff --git a/src/qt/optionsmodel.cpp b/src/qt/optionsmodel.cpp index 30a0a46601..54685fd5ad 100644 --- a/src/qt/optionsmodel.cpp +++ b/src/qt/optionsmodel.cpp @@ -153,6 +153,11 @@ void OptionsModel::Init(bool resetSettings) if (!settings.contains("bZeroBalanceAddressToken")) settings.setValue("bZeroBalanceAddressToken", DEFAULT_ZERO_BALANCE_ADDRESS_TOKEN); bZeroBalanceAddressToken = settings.value("bZeroBalanceAddressToken").toBool(); + + if (!settings.contains("signPSBTWithHWITool")) + settings.setValue("signPSBTWithHWITool", DEFAULT_SIGN_PSBT_WITH_HWI_TOOL); + if (!m_node.softSetBoolArg("-signpsbtwithhwitool", settings.value("signPSBTWithHWITool").toBool())) + addOverriddenOption("-signpsbtwithhwitool"); #endif if (!settings.contains("fCheckForUpdates")) @@ -381,6 +386,8 @@ QVariant OptionsModel::data(const QModelIndex & index, int role) const return settings.value("bZeroBalanceAddressToken"); case ReserveBalance: return settings.value("nReserveBalance"); + case SignPSBTWithHWITool: + return settings.value("signPSBTWithHWITool"); #endif case DisplayUnit: return nDisplayUnit; @@ -519,6 +526,13 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in settings.setValue("bZeroBalanceAddressToken", bZeroBalanceAddressToken); Q_EMIT zeroBalanceAddressTokenChanged(bZeroBalanceAddressToken); break; + case SignPSBTWithHWITool: + if (settings.value("signPSBTWithHWITool") != value) { + settings.setValue("signPSBTWithHWITool", value); + setRestartRequired(true); + } + break; + #endif case DisplayUnit: setDisplayUnit(value); diff --git a/src/qt/optionsmodel.h b/src/qt/optionsmodel.h index 05b527c424..0a11b5622a 100644 --- a/src/qt/optionsmodel.h +++ b/src/qt/optionsmodel.h @@ -71,6 +71,7 @@ class OptionsModel : public QAbstractListModel ReserveBalance, // CAmount Theme, // QString HWIToolPath, // QString + SignPSBTWithHWITool, // bool OptionIDRowCount, }; diff --git a/src/wallet/init.cpp b/src/wallet/init.cpp index 66e0157762..8bc4c3a79a 100644 --- a/src/wallet/init.cpp +++ b/src/wallet/init.cpp @@ -84,6 +84,7 @@ void WalletInit::AddWalletOptions() const gArgs.AddArg("-minstakerutxosize=", strprintf("The min value of utxo (in %s) selected for staking (default: %s)", CURRENCY_UNIT, FormatMoney(DEFAULT_STAKER_MIN_UTXO_SIZE)), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); gArgs.AddArg("-maxstakerutxoscriptcache=", strprintf("Set max staker utxo script cache for staking (default: %d)", DEFAULT_STAKER_MAX_UTXO_SCRIPT_CACHE), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); gArgs.AddArg("-stakerthreads=", strprintf("Set the number of threads the staker use for processing (default is the number of cores to your machine: %d)", GetNumCores()), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); + gArgs.AddArg("-signpsbtwithhwitool", strprintf("Sign PSBT with HWI tool"), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); } bool WalletInit::ParameterInteraction() const diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index 0c736ee445..5a723be372 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -109,6 +109,9 @@ static const CAmount DEFAULT_STAKER_MIN_UTXO_SIZE = 0; //! -maxstakerutxoscriptcache default static const int32_t DEFAULT_STAKER_MAX_UTXO_SCRIPT_CACHE = 200000; +//! -signpsbtwithhwitool default +static const bool DEFAULT_SIGN_PSBT_WITH_HWI_TOOL = false; + class CCoinControl; class COutput; class CScript; From d056e9b960e85fdd80c535872c550ef415062f15 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 12 Feb 2021 13:05:10 +0100 Subject: [PATCH 081/164] Update setting data for add delegation --- src/interfaces/wallet.cpp | 48 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/interfaces/wallet.cpp b/src/interfaces/wallet.cpp index 26c9eb1519..15bd801c1d 100644 --- a/src/interfaces/wallet.cpp +++ b/src/interfaces/wallet.cpp @@ -1417,6 +1417,54 @@ class WalletImpl : public Wallet } bool setAddDelegationData(std::string& psbt, const std::map& signData, std::string& error) override { + // Decode transaction + PartiallySignedTransaction decoded_psbt; + if(!DecodeBase64PSBT(decoded_psbt, psbt, error)) + { + error = "Fail to decode PSBT transaction"; + return false; + } + + // Set signed staker address + size_t size = decoded_psbt.tx->vout.size(); + for (auto it = signData.begin(); it != signData.end(); it++) + { + size_t n = it->first; + std::string PoD = it->second.PoD; + + if(n >= size) + { + error = "Output not found"; + return false; + } + + CTxOut& v = decoded_psbt.tx->vout[n]; + if(v.scriptPubKey.HasOpCall()){ + std::vector data; + v.scriptPubKey.GetData(data); + CScript scriptRet; + if(QtumDelegation::SetSignedStaker(data, PoD) && v.scriptPubKey.SetData(data, scriptRet)) + { + v.scriptPubKey = scriptRet; + } + else + { + error = "Fail to set PoD"; + return false; + } + } + else + { + error = "Output not op_call"; + return false; + } + } + + // Serialize the PSBT + CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); + ssTx << decoded_psbt; + psbt = EncodeBase64((unsigned char*)ssTx.data(), ssTx.size()); + return true; } std::unique_ptr handleUnload(UnloadFn fn) override From 7a2c3ce611942a7b6d0319db7bc4e145461e76ac Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 12 Feb 2021 16:53:20 +0100 Subject: [PATCH 082/164] Update split utxo to create psbt --- src/qt/splitutxopage.cpp | 8 ++++++- src/rpc/client.cpp | 1 + src/wallet/rpcwallet.cpp | 51 +++++++++++++++++++++++++++++++++------- 3 files changed, 51 insertions(+), 9 deletions(-) diff --git a/src/qt/splitutxopage.cpp b/src/qt/splitutxopage.cpp index 4899890ad7..fe2b15940b 100644 --- a/src/qt/splitutxopage.cpp +++ b/src/qt/splitutxopage.cpp @@ -248,6 +248,12 @@ void SplitUTXOPage::on_splitCoinsClicked() { QVariantMap variantMap = result.toMap(); + if(bCreateUnsigned) + { + GUIUtil::setClipboard(variantMap.value("psbt").toString()); + Q_EMIT message(tr("PSBT copied"), "Copied to clipboard", CClientUIInterface::MSG_INFORMATION); + } + QString selectedString = variantMap.value("selected").toString(); CAmount selected; BitcoinUnits::parse(unit, selectedString, &selected); @@ -267,7 +273,7 @@ void SplitUTXOPage::on_splitCoinsClicked() QMessageBox::information(this, tr("Split coins for address"), infoString); - if(splited == selected || splited == 0) + if(splited == selected || splited == 0 || bCreateUnsigned) accept(); } } diff --git a/src/rpc/client.cpp b/src/rpc/client.cpp index e41f193c43..e43c89058f 100644 --- a/src/rpc/client.cpp +++ b/src/rpc/client.cpp @@ -44,6 +44,7 @@ static const CRPCConvertParam vRPCConvertParams[] = { "splitutxosforaddress", 1, "minValue" }, { "splitutxosforaddress", 2, "maxValue" }, { "splitutxosforaddress", 3, "maxOutputs" }, + { "splitutxosforaddress", 4, "psbt" }, { "settxfee", 0, "amount" }, { "sethdseed", 0, "newkeypool" }, { "getsubsidy", 0, "height" }, diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index fdb039053c..49948fe084 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -438,7 +438,7 @@ void SplitRemainder(std::vector& vecSend, CAmount& remainder, CAmoun } } -static CTransactionRef SplitUTXOs(interfaces::Chain::Lock& locked_chain, CWallet * const pwallet, const CTxDestination &address, CAmount nValue, CAmount maxValue, const CCoinControl& coin_control, CAmount nTotal, int maxOutputs, CAmount& nSplited) +static CTransactionRef SplitUTXOs(interfaces::Chain::Lock& locked_chain, CWallet * const pwallet, const CTxDestination &address, CAmount nValue, CAmount maxValue, const CCoinControl& coin_control, CAmount nTotal, int maxOutputs, CAmount& nSplited, bool sign) { // Check amount if (nValue <= 0) @@ -489,7 +489,7 @@ static CTransactionRef SplitUTXOs(interfaces::Chain::Lock& locked_chain, CWallet CTransactionRef tx; if((nTxAmount + pwallet->m_default_max_tx_fee) <= nTotal) { - if (!pwallet->CreateTransaction(locked_chain, vecSend, tx, nFeeRequired, nChangePosRet, strError, coin_control, true, 0, true)) { + if (!pwallet->CreateTransaction(locked_chain, vecSend, tx, nFeeRequired, nChangePosRet, strError, coin_control, sign, 0, true)) { throw JSONRPCError(RPC_WALLET_ERROR, strError); } nSplited = nFeeRequired; @@ -500,7 +500,7 @@ static CTransactionRef SplitUTXOs(interfaces::Chain::Lock& locked_chain, CWallet CRecipient lastRecipient = vecSend[vecSend.size() - 1]; lastRecipient.fSubtractFeeFromAmount = true; vecSend[vecSend.size() - 1] = lastRecipient; - if (!pwallet->CreateTransaction(locked_chain, vecSend, tx, nFeeRequired, nChangePosRet, strError, coin_control, true, 0, true)) { + if (!pwallet->CreateTransaction(locked_chain, vecSend, tx, nFeeRequired, nChangePosRet, strError, coin_control, sign, 0, true)) { throw JSONRPCError(RPC_WALLET_ERROR, strError); } @@ -532,7 +532,7 @@ static CTransactionRef SplitUTXOs(interfaces::Chain::Lock& locked_chain, CWallet SplitRemainder(vecSend, nValueLast2, maxValue); } - if((!pwallet->CreateTransaction(locked_chain, vecSend, tx, nFeeRequired, nChangePosRet, strError, coin_control, true, 0, true))) { + if((!pwallet->CreateTransaction(locked_chain, vecSend, tx, nFeeRequired, nChangePosRet, strError, coin_control, sign, 0, true))) { throw JSONRPCError(RPC_WALLET_ERROR, strError); } if(payFeeRemainder) @@ -550,7 +550,7 @@ static CTransactionRef SplitUTXOs(interfaces::Chain::Lock& locked_chain, CWallet } // Send the transaction - pwallet->CommitTransaction(tx, {} /* mapValue */, {} /* orderForm */); + if(sign) pwallet->CommitTransaction(tx, {} /* mapValue */, {} /* orderForm */); return tx; } @@ -721,6 +721,7 @@ static UniValue splitutxosforaddress(const JSONRPCRequest& request) {"minValue", RPCArg::Type::AMOUNT, RPCArg::Optional::NO, "Select utxo which value is smaller than value (minimum 0.1 COIN)"}, {"maxValue", RPCArg::Type::AMOUNT, RPCArg::Optional::NO, "Select utxo which value is greater than value (minimum 0.1 COIN)"}, {"maxOutputs", RPCArg::Type::NUM, /* default */ "100", "Maximum outputs to create"}, + {"psbt", RPCArg::Type::BOOL, RPCArg::Optional::OMITTED, "Create partially signed transaction."}, }, RPCResult{ RPCResult::Type::OBJ, "", "", @@ -772,6 +773,12 @@ static UniValue splitutxosforaddress(const JSONRPCRequest& request) throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid value for maximum outputs"); } + // Is psbt + bool fPsbt=pwallet->IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS); + if (request.params.size() > 4){ + fPsbt=request.params[4].get_bool(); + } + // Amount CAmount nSplitAmount = minValue; CAmount nRequiredAmount = nSplitAmount * maxOutputs; @@ -809,8 +816,36 @@ static UniValue splitutxosforaddress(const JSONRPCRequest& request) UniValue obj(UniValue::VOBJ); if(coin_control.HasSelected() && nSplitAmount < nSelectedAmount){ EnsureWalletIsUnlocked(pwallet); - CTransactionRef tx = SplitUTXOs(*locked_chain, pwallet, address, nSplitAmount, maxValue, coin_control, nSelectedAmount, maxOutputs, splited); - obj.pushKV("txid", tx->GetHash().GetHex()); + CTransactionRef tx = SplitUTXOs(*locked_chain, pwallet, address, nSplitAmount, maxValue, coin_control, nSelectedAmount, maxOutputs, splited, !fPsbt); + if(fPsbt){ + // Make a blank psbt + PartiallySignedTransaction psbtx; + CMutableTransaction rawTx = CMutableTransaction(*tx); + psbtx.tx = rawTx; + for (unsigned int i = 0; i < rawTx.vin.size(); ++i) { + psbtx.inputs.push_back(PSBTInput()); + } + for (unsigned int i = 0; i < rawTx.vout.size(); ++i) { + psbtx.outputs.push_back(PSBTOutput()); + } + + // Fill transaction with out data but don't sign + bool bip32derivs = true; + bool complete = true; + const TransactionError err = pwallet->FillPSBT(psbtx, complete, 1, false, bip32derivs); + if (err != TransactionError::OK) { + throw JSONRPCTransactionError(err); + } + + // Serialize the PSBT + CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); + ssTx << psbtx; + obj.pushKV("psbt", EncodeBase64((unsigned char*)ssTx.data(), ssTx.size())); + } + else + { + obj.pushKV("txid", tx->GetHash().GetHex()); + } } obj.pushKV("selected", FormatMoney(total)); @@ -6209,7 +6244,7 @@ static const CRPCCommand commands[] = { "wallet", "sendmany", &sendmany, {"dummy","amounts","minconf","comment","subtractfeefrom","replaceable","conf_target","estimate_mode"} }, { "wallet", "sendmanywithdupes", &sendmanywithdupes, {"fromaccount","amounts","minconf","comment","subtractfeefrom"} }, { "wallet", "sendtoaddress", &sendtoaddress, {"address","amount","comment","comment_to","subtractfeefromamount","replaceable","conf_target","estimate_mode","avoid_reuse","senderAddress","changeToSender"} }, - { "wallet", "splitutxosforaddress", &splitutxosforaddress, {"address","minValue","maxValue","maxOutputs"} }, + { "wallet", "splitutxosforaddress", &splitutxosforaddress, {"address","minValue","maxValue","maxOutputs","psbt"} }, { "wallet", "sethdseed", &sethdseed, {"newkeypool","seed"} }, { "wallet", "setlabel", &setlabel, {"address","label"} }, { "wallet", "settxfee", &settxfee, {"amount"} }, From 5172aa3c10742b639a66eb5eb931cd16f3531f89 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 15 Feb 2021 09:44:22 +0100 Subject: [PATCH 083/164] Fix split utxo for psbt --- src/wallet/rpcwallet.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 49948fe084..d8bbaa7b97 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -489,7 +489,7 @@ static CTransactionRef SplitUTXOs(interfaces::Chain::Lock& locked_chain, CWallet CTransactionRef tx; if((nTxAmount + pwallet->m_default_max_tx_fee) <= nTotal) { - if (!pwallet->CreateTransaction(locked_chain, vecSend, tx, nFeeRequired, nChangePosRet, strError, coin_control, sign, 0, true)) { + if (!pwallet->CreateTransaction(locked_chain, vecSend, tx, nFeeRequired, nChangePosRet, strError, coin_control, sign, 0, false)) { throw JSONRPCError(RPC_WALLET_ERROR, strError); } nSplited = nFeeRequired; @@ -500,7 +500,7 @@ static CTransactionRef SplitUTXOs(interfaces::Chain::Lock& locked_chain, CWallet CRecipient lastRecipient = vecSend[vecSend.size() - 1]; lastRecipient.fSubtractFeeFromAmount = true; vecSend[vecSend.size() - 1] = lastRecipient; - if (!pwallet->CreateTransaction(locked_chain, vecSend, tx, nFeeRequired, nChangePosRet, strError, coin_control, sign, 0, true)) { + if (!pwallet->CreateTransaction(locked_chain, vecSend, tx, nFeeRequired, nChangePosRet, strError, coin_control, sign, 0, false)) { throw JSONRPCError(RPC_WALLET_ERROR, strError); } @@ -532,7 +532,7 @@ static CTransactionRef SplitUTXOs(interfaces::Chain::Lock& locked_chain, CWallet SplitRemainder(vecSend, nValueLast2, maxValue); } - if((!pwallet->CreateTransaction(locked_chain, vecSend, tx, nFeeRequired, nChangePosRet, strError, coin_control, sign, 0, true))) { + if((!pwallet->CreateTransaction(locked_chain, vecSend, tx, nFeeRequired, nChangePosRet, strError, coin_control, sign, 0, false))) { throw JSONRPCError(RPC_WALLET_ERROR, strError); } if(payFeeRemainder) @@ -785,6 +785,7 @@ static UniValue splitutxosforaddress(const JSONRPCRequest& request) CCoinControl coin_control; coin_control.destChange = address; + if(fPsbt) coin_control.fAllowWatchOnly = true; // Find UTXOs for a address with value smaller than minValue and greater then maxValue std::vector vecOutputs; @@ -979,6 +980,7 @@ static UniValue createcontract(const JSONRPCRequest& request){ if(fPsbt) fBroadcast=false; CCoinControl coinControl; + if(fPsbt) coinControl.fAllowWatchOnly = true; CTxDestination signSenderAddress = CNoDestination(); if(fHasSender){ @@ -1243,6 +1245,7 @@ UniValue SendToContract(interfaces::Chain::Lock& locked_chain, CWallet* const pw if(fPsbt) fBroadcast=false; CCoinControl coinControl; + if(fPsbt) coinControl.fAllowWatchOnly = true; CTxDestination signSenderAddress = CNoDestination(); if(fHasSender){ From 80ea80ecb577aef56392f4d09f355dcca2f3452a Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 15 Feb 2021 10:52:45 +0100 Subject: [PATCH 084/164] Update match for my delegation for hardware wallet --- src/miner.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/miner.cpp b/src/miner.cpp index 36dae79c07..2e9cb36804 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -1055,13 +1055,20 @@ class MyDelegations : public DelegationFilterBase MyDelegations(CWallet *_pwallet): pwallet(_pwallet), cacheHeight(0), - spk_man(0) + spk_man(0), + privateKeysDisabled(false) { spk_man = _pwallet->GetLegacyScriptPubKeyMan(); + privateKeysDisabled = _pwallet->IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS); } bool Match(const DelegationEvent& event) const { + if(privateKeysDisabled) + { + return pwallet->IsMine(PKHash(event.item.delegate)); + } + return spk_man->HaveKey(CKeyID(event.item.delegate)); } @@ -1148,6 +1155,7 @@ class MyDelegations : public DelegationFilterBase int32_t cacheHeight; std::map cacheMyDelegations; LegacyScriptPubKeyMan* spk_man; + bool privateKeysDisabled; }; bool CheckStake(const std::shared_ptr pblock, CWallet& wallet) From 47ff2182202065555633564e7644d179d66a91f4 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 15 Feb 2021 11:01:57 +0100 Subject: [PATCH 085/164] Stop the gui updates when shutdown is requirested --- src/qt/delegationitemmodel.cpp | 3 +++ src/qt/superstakeritemmodel.cpp | 3 +++ src/qt/tokenitemmodel.cpp | 9 +++++++++ src/qt/walletmodel.cpp | 3 +++ 4 files changed, 18 insertions(+) diff --git a/src/qt/delegationitemmodel.cpp b/src/qt/delegationitemmodel.cpp index 57247c247e..29092d66b5 100755 --- a/src/qt/delegationitemmodel.cpp +++ b/src/qt/delegationitemmodel.cpp @@ -86,6 +86,9 @@ class DelegationWorker : public QObject private Q_SLOTS: void updateDelegationData(QString hash, QString delegateAddress, QString stakerAddress, quint8 fee, qint32 blockNumber) { + if(walletModel && walletModel->node().shutdownRequested()) + return; + // Find delegation details std::string sHash = hash.toStdString(); std::string sDelegateAddress = delegateAddress.toStdString(); diff --git a/src/qt/superstakeritemmodel.cpp b/src/qt/superstakeritemmodel.cpp index ee64afae9d..007f84ffba 100755 --- a/src/qt/superstakeritemmodel.cpp +++ b/src/qt/superstakeritemmodel.cpp @@ -79,6 +79,9 @@ class SuperStakerWorker : public QObject private Q_SLOTS: void updateSuperStakerData(QString hash, QString stakerAddress) { + if(walletModel && walletModel->node().shutdownRequested()) + return; + // Get address balance bool staking = false; CAmount balance = 0; diff --git a/src/qt/tokenitemmodel.cpp b/src/qt/tokenitemmodel.cpp index 4d98560757..27e619068d 100755 --- a/src/qt/tokenitemmodel.cpp +++ b/src/qt/tokenitemmodel.cpp @@ -70,6 +70,9 @@ class TokenTxWorker : public QObject private Q_SLOTS: void updateTokenTx(const QString &hash) { + if(walletModel && walletModel->node().shutdownRequested()) + return; + // Initialize variables uint256 tokenHash = uint256S(hash.toStdString()); int64_t fromBlock = 0; @@ -143,11 +146,17 @@ private Q_SLOTS: void cleanTokenTxEntries() { + if(walletModel && walletModel->node().shutdownRequested()) + return; + if(walletModel) walletModel->wallet().cleanTokenTxEntries(); } void updateBalance(QString hash, QString contractAddress, QString senderAddress) { + if(walletModel && walletModel->node().shutdownRequested()) + return; + tokenAbi.setAddress(contractAddress.toStdString()); tokenAbi.setSender(senderAddress.toStdString()); std::string strBalance; diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index e108bea140..7be424825e 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -51,6 +51,9 @@ class WalletWorker : public QObject private Q_SLOTS: void updateModel() { + if(walletModel && walletModel->node().shutdownRequested()) + return; + // Update the model with results of task that take more time to be completed walletModel->checkHardwareWallet(); walletModel->checkCoinAddressesChanged(); From cd5b5af7cb92b6c01402bd48e6b1a1c9aa83d283 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 15 Feb 2021 14:21:25 +0100 Subject: [PATCH 086/164] Update send raw transaction to privide contract data --- src/qt/hardwaresigntxdialog.cpp | 3 ++- src/qt/qtumhwitool.cpp | 18 +++++++++++++++--- src/qt/qtumhwitool.h | 4 +++- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/qt/hardwaresigntxdialog.cpp b/src/qt/hardwaresigntxdialog.cpp index b569e15a76..38ba84fad2 100644 --- a/src/qt/hardwaresigntxdialog.cpp +++ b/src/qt/hardwaresigntxdialog.cpp @@ -183,7 +183,8 @@ void HardwareSignTxDialog::on_sendButton_clicked() QMessageBox::StandardButton retval = (QMessageBox::StandardButton)confirmationDialog.result(); if(retval == QMessageBox::Yes) { - if(d->tool->sendRawTransaction(d->hexTx)) + QVariantMap variantMap; + if(d->tool->sendRawTransaction(d->hexTx, variantMap)) { QDialog::accept(); } diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 74045a753f..7f98212446 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -27,6 +27,8 @@ static const QString PARAM_STOP_HEIGHT = "stop_height"; static const QString PARAM_REQUESTS = "requests"; static const QString PARAM_PSBT = "psbt"; static const QString PARAM_HEXTX = "hextx"; +static const QString PARAM_MAXFEERATE = "maxfeerate"; +static const QString PARAM_SHOWCONTRACTDATA = "showcontractdata"; static const QString LOAD_FORMAT = ":/ledger/%1_load"; static const QString DELETE_FORMAT = ":/ledger/%1_delete"; static const QString RC_PATH_FORMAT = ":/ledger"; @@ -43,7 +45,7 @@ class QtumHwiToolPriv cmdImport = new ExecRPCCommand("importmulti", mandatoryImport, QStringList(), QMap(), parent); QStringList mandatoryFinalize = QStringList() << PARAM_PSBT; cmdFinalize = new ExecRPCCommand("finalizepsbt", mandatoryFinalize, QStringList(), QMap(), parent); - QStringList mandatorySend = QStringList() << PARAM_HEXTX; + QStringList mandatorySend = QStringList() << PARAM_HEXTX << PARAM_MAXFEERATE << PARAM_SHOWCONTRACTDATA; cmdSend = new ExecRPCCommand("sendrawtransaction", mandatorySend, QStringList(), QMap(), parent); QStringList mandatoryDecode = QStringList() << PARAM_PSBT; cmdDecode = new ExecRPCCommand("decodepsbt", mandatoryDecode, QStringList(), QMap(), parent); @@ -486,7 +488,7 @@ bool QtumHwiTool::finalizePsbt(const QString &psbt, QString &hexTx, bool &comple return true; } -bool QtumHwiTool::sendRawTransaction(const QString &hexTx) +bool QtumHwiTool::sendRawTransaction(const QString &hexTx, QVariantMap& variantMap) { if(!d->model) return false; @@ -495,6 +497,8 @@ bool QtumHwiTool::sendRawTransaction(const QString &hexTx) QVariant result; QString resultStr; ExecRPCCommand::appendParam(lstParams, PARAM_HEXTX, hexTx); + ExecRPCCommand::appendParam(lstParams, PARAM_MAXFEERATE, "null"); + ExecRPCCommand::appendParam(lstParams, PARAM_SHOWCONTRACTDATA, "true"); // Exec RPC if(!execRPC(d->cmdSend, lstParams, result, resultStr)) @@ -502,8 +506,16 @@ bool QtumHwiTool::sendRawTransaction(const QString &hexTx) // Parse results std::string strHash = resultStr.toStdString(); + if(strHash.length() == 64 && IsHex(strHash)) + { + variantMap["txid"] = resultStr; + } + else + { + variantMap = result.toMap(); + } - return strHash.length() == 64 && IsHex(strHash); + return variantMap.contains("txid"); } bool QtumHwiTool::decodePsbt(const QString &psbt, QString &decoded) diff --git a/src/qt/qtumhwitool.h b/src/qt/qtumhwitool.h index 972ec43aa6..817ef1d7a8 100644 --- a/src/qt/qtumhwitool.h +++ b/src/qt/qtumhwitool.h @@ -4,6 +4,7 @@ #include #include #include +#include class QtumHwiToolPriv; class InstallDevicePriv; class WalletModel; @@ -221,9 +222,10 @@ class QtumHwiTool : public QObject /** * @brief sendRawTransaction Send raw transaction * @param hexTx Hex transaction + * @param variantMap Result of the send operation * @return success of the operation */ - bool sendRawTransaction(const QString& hexTx); + bool sendRawTransaction(const QString& hexTx, QVariantMap& variantMap); /** * @brief decodePsbt Decode psbt transaction From 63bc25ab74f0ddefe8bb79871c7e22a17fd128a6 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 15 Feb 2021 16:14:47 +0100 Subject: [PATCH 087/164] Move the code for signing transaction with hardware in HardwareSignTx --- src/Makefile.qt.include | 7 ++- src/qt/hardwaresigntx.cpp | 106 ++++++++++++++++++++++++++++++++ src/qt/hardwaresigntx.h | 76 +++++++++++++++++++++++ src/qt/hardwaresigntxdialog.cpp | 90 +++------------------------ src/qt/hardwaresigntxdialog.h | 4 +- 5 files changed, 198 insertions(+), 85 deletions(-) create mode 100644 src/qt/hardwaresigntx.cpp create mode 100644 src/qt/hardwaresigntx.h diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index 6f2f2751a8..0d81dadf7b 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -164,6 +164,7 @@ QT_MOC_CPP = \ qt/moc_qtumversionchecker.cpp \ qt/moc_qtumhwitool.cpp \ qt/moc_waitmessagebox.cpp \ + qt/moc_hardwaresigntx.cpp \ qt/moc_walletframe.cpp \ qt/moc_walletmodel.cpp \ qt/moc_walletview.cpp @@ -311,7 +312,8 @@ BITCOIN_QT_H = \ qt/walletview.h \ qt/winshutdownmonitor.h \ qt/qtumpushbutton.h \ - qt/qtumhwitool.h + qt/qtumhwitool.h \ + qt/hardwaresigntx.h RES_ICONS = \ qt/res/icons/add.png \ @@ -427,7 +429,8 @@ BITCOIN_QT_BASE_CPP = \ qt/utilitydialog.cpp\ qt/qtumversionchecker.cpp \ qt/qtumpushbutton.cpp \ - qt/qtumhwitool.cpp + qt/qtumhwitool.cpp \ + qt/hardwaresigntx.cpp BITCOIN_QT_WINDOWS_CPP = qt/winshutdownmonitor.cpp diff --git a/src/qt/hardwaresigntx.cpp b/src/qt/hardwaresigntx.cpp new file mode 100644 index 0000000000..15c45bc704 --- /dev/null +++ b/src/qt/hardwaresigntx.cpp @@ -0,0 +1,106 @@ +#if defined(HAVE_CONFIG_H) +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + + +HardwareSignTx::HardwareSignTx(QWidget *_widget) : QObject(_widget) +{ + tool = new QtumHwiTool(this); + widget = _widget; +} + +HardwareSignTx::~HardwareSignTx() +{} + +void HardwareSignTx::setModel(WalletModel *_model) +{ + model = _model; + tool->setModel(_model); +} + +bool HardwareSignTx::askDevice() +{ + // Check if the HWI tool exist + QString hwiToolPath = GUIUtil::getHwiToolPath(); + if(!QFile::exists(hwiToolPath)) + { + QMessageBox msgBox(widget); + msgBox.setWindowTitle(tr("HWI tool not found")); + msgBox.setTextFormat(Qt::RichText); + msgBox.setText(tr("HWI tool not found at path \"%1\".
Please download it from %2 and add the path to the settings.").arg(hwiToolPath, QTUM_HWI_TOOL)); + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.exec(); + return false; + } + + // Ask for ledger + QString fingerprint = model->getFingerprint(); + QString title = tr("Connect Ledger"); + QString message = tr("Please insert your Ledger (%1). Verify the cable is connected and that no other application is using it.\n\nTry to connect again?"); + if(HardwareKeystoreDialog::AskDevice(fingerprint, title, message.arg(fingerprint), widget)) + { + model->setFingerprint(fingerprint); + return true; + } + + model->setFingerprint(""); + return false; +} + +bool HardwareSignTx::sign() +{ + if(askDevice()) + { + // Sign transaction with hardware + WaitMessageBox dlg(tr("Ledger Status"), tr("Confirm Transaction on your Ledger device..."), [this]() { + QString fingerprint = model->getFingerprint(); + QString tmpPsbt = psbt; + hexTx = ""; + complete = false; + bool ret = tool->signDelegate(fingerprint, tmpPsbt); + if(ret) ret &= tool->signTx(fingerprint, tmpPsbt); + if(ret) ret &= tool->finalizePsbt(tmpPsbt, hexTx, complete); + }, widget); + + dlg.exec(); + + if(!complete) + { + QMessageBox::warning(widget, tr("Sign failed"), tr("The transaction has no a complete set of signatures.")); + } + } + + return complete; +} + +bool HardwareSignTx::send(QVariantMap &result) +{ + if(tool->sendRawTransaction(hexTx, result)) + { + return true; + } + else + { + // Display error message + QString errorMessage = tool->errorMessage(); + if(errorMessage.isEmpty()) errorMessage = tr("Unknown transaction error"); + QMessageBox::warning(widget, tr("Broadcast transaction"), errorMessage); + } + + return false; +} + +void HardwareSignTx::setPsbt(const QString &_psbt) +{ + psbt = _psbt; + hexTx = ""; + complete = false; +} diff --git a/src/qt/hardwaresigntx.h b/src/qt/hardwaresigntx.h new file mode 100644 index 0000000000..823f9a400c --- /dev/null +++ b/src/qt/hardwaresigntx.h @@ -0,0 +1,76 @@ +#ifndef HARDWARESIGNTX_H +#define HARDWARESIGNTX_H + +#include +#include +#include +#include +#include +class WalletModel; +class QtumHwiTool; + +/** + * @brief The HardwareSignTx class Communicate with the Qtum Hardware Wallet Interface Tool + */ +class HardwareSignTx : public QObject +{ + Q_OBJECT +public: + /** + * @brief HardwareSignTx Constructor + * @param parent Parent object + */ + explicit HardwareSignTx(QWidget *widget); + + /** + * @brief ~HardwareSignTx Destructor + */ + ~HardwareSignTx(); + + /** + * @brief setModel Set wallet model + * @param model Wallet model + */ + void setModel(WalletModel *model); + + /** + * @brief setPsbt Set psbt transaction + * @param psbt Raw transaction + */ + void setPsbt(const QString& psbt); + + /** + * @brief askDevice Ask for hardware device + * @return success of the operation + */ + bool askDevice(); + + /** + * @brief sign Sign transaction + * @return success of the operation + */ + bool sign(); + + /** + * @brief send Send transaction + * @param result + * @return success of the operation + */ + bool send(QVariantMap& result); + +Q_SIGNALS: + +public Q_SLOTS: + +public: + WalletModel* model = 0; + QtumHwiTool* tool = 0; + QString psbt; + QString hexTx; + bool complete = false; + +private: + QWidget *widget = 0; +}; + +#endif // HARDWARESIGNTX_H diff --git a/src/qt/hardwaresigntxdialog.cpp b/src/qt/hardwaresigntxdialog.cpp index 38ba84fad2..74a630d9c5 100644 --- a/src/qt/hardwaresigntxdialog.cpp +++ b/src/qt/hardwaresigntxdialog.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -21,28 +22,13 @@ #include #include -class HardwareSignTxDialogPriv -{ -public: - HardwareSignTxDialogPriv(QObject *parent) - { - tool = new QtumHwiTool(parent); - } - - WalletModel* model = 0; - QtumHwiTool* tool = 0; - QString psbt; - QString hexTx; - bool complete = false; -}; - HardwareSignTxDialog::HardwareSignTxDialog(const QString &tx, QWidget *parent) : QDialog(parent), ui(new Ui::HardwareSignTxDialog) { // Init variables ui->setupUi(this); - d = new HardwareSignTxDialogPriv(this); + d = new HardwareSignTx(this); ui->textEditTxData->setText(tx); ui->textEditTxData->setReadOnly(tx != ""); ui->textEditTxDetails->setReadOnly(true); @@ -56,7 +42,6 @@ HardwareSignTxDialog::HardwareSignTxDialog(const QString &tx, QWidget *parent) : HardwareSignTxDialog::~HardwareSignTxDialog() { delete ui; - delete d; } void HardwareSignTxDialog::on_cancelButton_clicked() @@ -66,8 +51,7 @@ void HardwareSignTxDialog::on_cancelButton_clicked() void HardwareSignTxDialog::setModel(WalletModel *model) { - d->model = model; - d->tool->setModel(model); + d->setModel(model); txChanged(); if(!d->model->wallet().privateKeysDisabled()) { @@ -147,30 +131,10 @@ void HardwareSignTxDialog::txChanged() void HardwareSignTxDialog::on_signButton_clicked() { - if(askDevice()) + if(d->sign()) { - // Sign transaction with hardware - WaitMessageBox dlg(tr("Ledger Status"), tr("Confirm Transaction on your Ledger device..."), [this]() { - QString fingerprint = d->model->getFingerprint(); - QString psbt = d->psbt; - d->hexTx = ""; - d->complete = false; - bool ret = d->tool->signDelegate(fingerprint, psbt); - if(ret) ret &= d->tool->signTx(fingerprint, psbt); - if(ret) ret &= d->tool->finalizePsbt(psbt, d->hexTx, d->complete); - if(d->complete) - { - ui->sendButton->setEnabled(true); - on_sendButton_clicked(); - } - }, this); - - dlg.exec(); - - if(!d->complete) - { - QMessageBox::warning(this, tr("Sign failed"), tr("The transaction has no a complete set of signatures.")); - } + ui->sendButton->setEnabled(true); + on_sendButton_clicked(); } } @@ -183,50 +147,14 @@ void HardwareSignTxDialog::on_sendButton_clicked() QMessageBox::StandardButton retval = (QMessageBox::StandardButton)confirmationDialog.result(); if(retval == QMessageBox::Yes) { - QVariantMap variantMap; - if(d->tool->sendRawTransaction(d->hexTx, variantMap)) + QVariantMap result; + if(d->send(result)) { QDialog::accept(); } - else - { - // Display error message - QString errorMessage = d->tool->errorMessage(); - if(errorMessage.isEmpty()) errorMessage = tr("Unknown transaction error"); - QMessageBox::warning(this, tr("Broadcast transaction"), errorMessage); - } } } -bool HardwareSignTxDialog::askDevice() -{ - // Check if the HWI tool exist - QString hwiToolPath = GUIUtil::getHwiToolPath(); - if(!QFile::exists(hwiToolPath)) - { - QMessageBox msgBox(this); - msgBox.setWindowTitle(tr("HWI tool not found")); - msgBox.setTextFormat(Qt::RichText); - msgBox.setText(tr("HWI tool not found at path \"%1\".
Please download it from %2 and add the path to the settings.").arg(hwiToolPath, QTUM_HWI_TOOL)); - msgBox.setStandardButtons(QMessageBox::Ok); - msgBox.exec(); - return false; - } - - // Ask for ledger - QString fingerprint = d->model->getFingerprint(); - QString title = tr("Connect Ledger"); - QString message = tr("Please insert your Ledger (%1). Verify the cable is connected and that no other application is using it.\n\nTry to connect again?"); - if(HardwareKeystoreDialog::AskDevice(fingerprint, title, message.arg(fingerprint), this)) - { - d->model->setFingerprint(fingerprint); - return true; - } - - d->model->setFingerprint(""); - return false; -} - void HardwareSignTxDialog::on_importButton_clicked() { // Import addresses and rescan @@ -254,7 +182,7 @@ bool HardwareSignTxDialog::importAddressesData(bool &rescan, bool &importPKH, bo // Ask for device bool fDevice = importPKH || importP2SH || importBech32; - if(fDevice) ret &= askDevice(); + if(fDevice) ret &= d->askDevice(); return ret; } diff --git a/src/qt/hardwaresigntxdialog.h b/src/qt/hardwaresigntxdialog.h index 9cccd30166..2ad267e34b 100644 --- a/src/qt/hardwaresigntxdialog.h +++ b/src/qt/hardwaresigntxdialog.h @@ -6,7 +6,7 @@ namespace Ui { class HardwareSignTxDialog; } -class HardwareSignTxDialogPriv; +class HardwareSignTx; class WalletModel; class HardwareSignTxDialog : public QDialog @@ -32,7 +32,7 @@ private Q_SLOTS: private: Ui::HardwareSignTxDialog *ui; - HardwareSignTxDialogPriv* d; + HardwareSignTx* d; }; #endif // HARDWARESIGNTXDIALOG_H From 92fd103c2e3a12ce0eba5e0e540b94d00dd17fb9 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Tue, 16 Feb 2021 09:15:24 +0100 Subject: [PATCH 088/164] Add createUnsigned method to model --- src/qt/walletmodel.cpp | 23 +++++++++++++++++++++++ src/qt/walletmodel.h | 2 ++ 2 files changed, 25 insertions(+) diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index 7be424825e..a45a176507 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -890,3 +890,26 @@ void WalletModel::importAddressesData(bool _rescan, bool _importPKH, bool _impor importBech32 = _importBech32; hardwareWalletInitRequired = true; } + +bool WalletModel::getSignPsbtWithHwiTool() +{ + return wallet().privateKeysDisabled() && gArgs.GetBoolArg("-signpsbtwithhwitool", DEFAULT_SIGN_PSBT_WITH_HWI_TOOL); +} + +bool WalletModel::createUnsigned() +{ + if(wallet().privateKeysDisabled()) + { + QString hwiToolPath = GUIUtil::getHwiToolPath(); + if(QFile::exists(hwiToolPath)) + { + return !getSignPsbtWithHwiTool(); + } + else + { + return true; + } + } + + return false; +} diff --git a/src/qt/walletmodel.h b/src/qt/walletmodel.h index a718c80632..16c8e9b900 100644 --- a/src/qt/walletmodel.h +++ b/src/qt/walletmodel.h @@ -183,6 +183,8 @@ class WalletModel : public QObject // Get or set hardware wallet init required (only for hardware wallet applicable) void importAddressesData(bool rescan = true, bool importPKH = true, bool importP2SH = true, bool importBech32 = true); + bool getSignPsbtWithHwiTool(); + bool createUnsigned(); private: std::unique_ptr m_wallet; From 97bbb62084399531c5d40d2de8ef375069c29746 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Tue, 16 Feb 2021 11:49:35 +0100 Subject: [PATCH 089/164] Sign psbt with hwi tool --- src/qt/adddelegationpage.cpp | 30 ++++++++++++++------- src/qt/createcontract.cpp | 33 ++++++++++++++++------- src/qt/hardwaresigntx.cpp | 28 ++++++++++++++++++++ src/qt/hardwaresigntx.h | 10 +++++++ src/qt/removedelegationpage.cpp | 19 +++++++++++--- src/qt/sendcoinsdialog.cpp | 35 +++++++++++++++++++------ src/qt/sendcoinsdialog.h | 1 + src/qt/sendtocontract.cpp | 33 ++++++++++++++++------- src/qt/sendtokenpage.cpp | 38 ++++++++++++++++++++------- src/qt/splitutxopage.cpp | 46 +++++++++++++++++++++------------ src/qt/token.cpp | 5 ++++ src/qt/token.h | 3 +++ src/qt/walletmodel.cpp | 6 +++++ src/wallet/rpcwallet.cpp | 12 +++++++++ src/wallet/wallet.h | 2 +- 15 files changed, 234 insertions(+), 67 deletions(-) diff --git a/src/qt/adddelegationpage.cpp b/src/qt/adddelegationpage.cpp index cf64a0654d..88a0857c29 100644 --- a/src/qt/adddelegationpage.cpp +++ b/src/qt/adddelegationpage.cpp @@ -11,6 +11,7 @@ #include #include #include +#include namespace AddDelegation_NS { @@ -100,7 +101,7 @@ void AddDelegationPage::setModel(WalletModel *_model) // update the display unit, to not use the default ("QTUM") updateDisplayUnit(); - bCreateUnsigned = m_model->wallet().privateKeysDisabled(); + bCreateUnsigned = m_model->createUnsigned(); if (bCreateUnsigned) { ui->addDelegationButton->setText(tr("Cr&eate Unsigned")); @@ -290,14 +291,25 @@ void AddDelegationPage::on_addDelegationClicked() } else { - std::string txid = variantMap.value("txid").toString().toStdString(); - interfaces::DelegationInfo delegation; - delegation.delegate_address = delegateAddress.toStdString(); - delegation.staker_address = stakerAddress.toStdString(); - delegation.staker_name = stakerName.trimmed().toStdString(); - delegation.fee = stakerFee; - delegation.create_tx_hash.SetHex(txid); - m_model->wallet().addDelegationEntry(delegation); + bool isSent = true; + if(m_model->getSignPsbtWithHwiTool()) + { + QString psbt = variantMap.value("psbt").toString(); + if(!HardwareSignTx::process(this, m_model, psbt, variantMap)) + isSent = false; + } + + if(isSent) + { + std::string txid = variantMap.value("txid").toString().toStdString(); + interfaces::DelegationInfo delegation; + delegation.delegate_address = delegateAddress.toStdString(); + delegation.staker_address = stakerAddress.toStdString(); + delegation.staker_name = stakerName.trimmed().toStdString(); + delegation.fee = stakerFee; + delegation.create_tx_hash.SetHex(txid); + m_model->wallet().addDelegationEntry(delegation); + } } } diff --git a/src/qt/createcontract.cpp b/src/qt/createcontract.cpp index 65889f7987..70432a454e 100644 --- a/src/qt/createcontract.cpp +++ b/src/qt/createcontract.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -117,7 +118,7 @@ void CreateContract::setModel(WalletModel *_model) // update the display unit, to not use the default ("QTUM") updateDisplayUnit(); - bCreateUnsigned = m_model->wallet().privateKeysDisabled(); + bCreateUnsigned = m_model->createUnsigned(); if (bCreateUnsigned) { ui->pushButtonCreateContract->setText(tr("Cr&eate Unsigned")); @@ -236,14 +237,28 @@ void CreateContract::on_createContractClicked() } else { - ContractResult *widgetResult = new ContractResult(ui->stackedWidget); - widgetResult->setResultData(result, FunctionABI(), QList(), ContractResult::CreateResult); - ui->stackedWidget->addWidget(widgetResult); - int position = ui->stackedWidget->count() - 1; - m_results = position == 1 ? 1 : m_results + 1; - - m_tabInfo->addTab(position, tr("Result %1").arg(m_results)); - m_tabInfo->setCurrent(position); + bool isSent = true; + if(m_model->getSignPsbtWithHwiTool()) + { + QVariantMap variantMap = result.toMap(); + QString psbt = variantMap.value("psbt").toString(); + if(!HardwareSignTx::process(this, m_model, psbt, variantMap)) + isSent = false; + else + result = variantMap; + } + + if(isSent) + { + ContractResult *widgetResult = new ContractResult(ui->stackedWidget); + widgetResult->setResultData(result, FunctionABI(), QList(), ContractResult::CreateResult); + ui->stackedWidget->addWidget(widgetResult); + int position = ui->stackedWidget->count() - 1; + m_results = position == 1 ? 1 : m_results + 1; + + m_tabInfo->addTab(position, tr("Result %1").arg(m_results)); + m_tabInfo->setCurrent(position); + } } } else diff --git a/src/qt/hardwaresigntx.cpp b/src/qt/hardwaresigntx.cpp index 15c45bc704..39ae3a1e5f 100644 --- a/src/qt/hardwaresigntx.cpp +++ b/src/qt/hardwaresigntx.cpp @@ -104,3 +104,31 @@ void HardwareSignTx::setPsbt(const QString &_psbt) hexTx = ""; complete = false; } + +bool HardwareSignTx::process(QWidget *widget, WalletModel *model, const QString &psbt, QVariantMap &result) +{ + // Process transaction + HardwareSignTx tool(widget); + tool.setModel(model); + tool.setPsbt(psbt); + bool ret = tool.sign(); + QVariantMap resultTool; + if(ret) ret &= tool.send(resultTool); + + // Process result + if(ret) + { + result["txid"] = resultTool["txid"]; + if(resultTool.contains("contracts")) + { + QList contracts = resultTool["contracts"].toList(); + for(QVariant contract : contracts) + { + result["address"] = contract.toMap()["address"]; + break; + } + } + } + + return ret; +} diff --git a/src/qt/hardwaresigntx.h b/src/qt/hardwaresigntx.h index 823f9a400c..821704c324 100644 --- a/src/qt/hardwaresigntx.h +++ b/src/qt/hardwaresigntx.h @@ -58,6 +58,16 @@ class HardwareSignTx : public QObject */ bool send(QVariantMap& result); + /** + * @brief process Process transaction + * @param widget Parent widget + * @param model Wallet model + * @param psbt Transaction + * @param result Result to update + * @return success of the operation + */ + static bool process(QWidget *widget, WalletModel *model, const QString& psbt, QVariantMap& result); + Q_SIGNALS: public Q_SLOTS: diff --git a/src/qt/removedelegationpage.cpp b/src/qt/removedelegationpage.cpp index c83db12b73..0e471a7f2c 100644 --- a/src/qt/removedelegationpage.cpp +++ b/src/qt/removedelegationpage.cpp @@ -9,6 +9,7 @@ #include #include #include +#include namespace RemoveDelegation_NS { @@ -76,7 +77,7 @@ void RemoveDelegationPage::setModel(WalletModel *_model) // update the display unit, to not use the default ("QTUM") updateDisplayUnit(); - bCreateUnsigned = m_model->wallet().privateKeysDisabled(); + bCreateUnsigned = m_model->createUnsigned(); if (bCreateUnsigned) { ui->removeDelegationButton->setText(tr("Cr&eate Unsigned")); @@ -245,14 +246,24 @@ void RemoveDelegationPage::on_removeDelegationClicked() QVariantMap variantMap = result.toMap(); if(bCreateUnsigned) { - QVariantMap variantMap = result.toMap(); GUIUtil::setClipboard(variantMap.value("psbt").toString()); Q_EMIT message(tr("PSBT copied"), "Copied to clipboard", CClientUIInterface::MSG_INFORMATION); } else { - std::string txid = variantMap.value("txid").toString().toStdString(); - m_model->wallet().setDelegationRemoved(sHash, txid); + bool isSent = true; + if(m_model->getSignPsbtWithHwiTool()) + { + QString psbt = variantMap.value("psbt").toString(); + if(!HardwareSignTx::process(this, m_model, psbt, variantMap)) + isSent = false; + } + + if(isSent) + { + std::string txid = variantMap.value("txid").toString().toStdString(); + m_model->wallet().setDelegationRemoved(sHash, txid); + } } } diff --git a/src/qt/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp index b1a88d81bc..9db373a831 100644 --- a/src/qt/sendcoinsdialog.cpp +++ b/src/qt/sendcoinsdialog.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -195,7 +196,7 @@ void SendCoinsDialog::setModel(WalletModel *_model) // set default rbf checkbox state ui->optInRBF->setCheckState(Qt::Checked); - if (model->wallet().privateKeysDisabled()) { + if (bCreateUnsigned) { ui->sendButton->setText(tr("Cr&eate Unsigned")); ui->sendButton->setToolTip(tr("Creates a Partially Signed Qtum Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); } @@ -213,6 +214,8 @@ void SendCoinsDialog::setModel(WalletModel *_model) ui->confTargetSelector->setCurrentIndex(getIndexForConfTarget(model->wallet().getConfirmTarget())); else ui->confTargetSelector->setCurrentIndex(getIndexForConfTarget(settings.value("nConfTarget").toInt())); + + bCreateUnsigned = _model->createUnsigned(); } } @@ -314,14 +317,14 @@ void SendCoinsDialog::on_sendButton_clicked() } QString questionString; - if (model->wallet().privateKeysDisabled()) { + if (bCreateUnsigned) { questionString.append(tr("Do you want to draft this transaction?")); } else { questionString.append(tr("Are you sure you want to send?")); } questionString.append("
"); - if (model->wallet().privateKeysDisabled()) { + if (bCreateUnsigned) { questionString.append(tr("Please, review your transaction proposal. This will produce a Partially Signed Qtum Transaction (PSBT) which you can copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); } else { questionString.append(tr("Please, review your transaction.")); @@ -376,8 +379,8 @@ void SendCoinsDialog::on_sendButton_clicked() } else { questionString = questionString.arg("

" + formatted.at(0)); } - const QString confirmation = model->wallet().privateKeysDisabled() ? tr("Confirm transaction proposal") : tr("Confirm send coins"); - const QString confirmButtonText = model->wallet().privateKeysDisabled() ? tr("Copy PSBT to clipboard") : tr("Send"); + const QString confirmation = bCreateUnsigned ? tr("Confirm transaction proposal") : tr("Confirm send coins"); + const QString confirmButtonText = bCreateUnsigned ? tr("Copy PSBT to clipboard") : tr("Send"); SendConfirmationDialog confirmationDialog(confirmation, questionString, informative_text, detailed_text, SEND_CONFIRM_DELAY, confirmButtonText, this); confirmationDialog.exec(); QMessageBox::StandardButton retval = static_cast(confirmationDialog.result()); @@ -399,8 +402,23 @@ void SendCoinsDialog::on_sendButton_clicked() // Serialize the PSBT CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); ssTx << psbtx; - GUIUtil::setClipboard(EncodeBase64(ssTx.str()).c_str()); - Q_EMIT message(tr("PSBT copied"), "Copied to clipboard", CClientUIInterface::MSG_INFORMATION); + QString psbt = EncodeBase64(ssTx.str()).c_str(); + if(model->getSignPsbtWithHwiTool()) + { + QVariantMap variantMap; + if(!HardwareSignTx::process(this, model, psbt, variantMap)) + send_failure = true; + else + { + std::string txid = variantMap["txid"].toString().toStdString(); + Q_EMIT coinsSent(uint256S(txid)); + } + } + else + { + GUIUtil::setClipboard(psbt); + Q_EMIT message(tr("PSBT copied"), "Copied to clipboard", CClientUIInterface::MSG_INFORMATION); + } } else { // now send the prepared transaction WalletModel::SendCoinsReturn sendStatus = model->sendCoins(currentTransaction); @@ -568,7 +586,8 @@ void SendCoinsDialog::setBalance(const interfaces::WalletBalances& balances) CAmount balance = balances.balance; if (model->wallet().privateKeysDisabled()) { balance = balances.watch_only_balance; - ui->labelBalanceName->setText(tr("Watch-only balance:")); + if(bCreateUnsigned) + ui->labelBalanceName->setText(tr("Watch-only balance:")); } ui->labelBalance->setText(BitcoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(), balance)); } diff --git a/src/qt/sendcoinsdialog.h b/src/qt/sendcoinsdialog.h index d615f015ff..3e73b12ef9 100644 --- a/src/qt/sendcoinsdialog.h +++ b/src/qt/sendcoinsdialog.h @@ -65,6 +65,7 @@ public Q_SLOTS: bool fNewRecipientAllowed; const PlatformStyle *platformStyle; int64_t targetSpacing; + bool bCreateUnsigned = false; // Process WalletModel::SendCoinsReturn and generate a pair consisting // of a message and message flags for use in Q_EMIT message(). diff --git a/src/qt/sendtocontract.cpp b/src/qt/sendtocontract.cpp index 5e4ad424ac..66c4de71c9 100644 --- a/src/qt/sendtocontract.cpp +++ b/src/qt/sendtocontract.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -141,7 +142,7 @@ void SendToContract::setModel(WalletModel *_model) // update the display unit, to not use the default ("QTUM") updateDisplayUnit(); - bCreateUnsigned = m_model->wallet().privateKeysDisabled(); + bCreateUnsigned = m_model->createUnsigned(); if (bCreateUnsigned) { ui->pushButtonSendToContract->setText(tr("Cr&eate Unsigned")); @@ -271,14 +272,28 @@ void SendToContract::on_sendToContractClicked() } else { - ContractResult *widgetResult = new ContractResult(ui->stackedWidget); - widgetResult->setResultData(result, FunctionABI(), m_ABIFunctionField->getParamsValues(), ContractResult::SendToResult); - ui->stackedWidget->addWidget(widgetResult); - int position = ui->stackedWidget->count() - 1; - m_results = position == 1 ? 1 : m_results + 1; - - m_tabInfo->addTab(position, tr("Result %1").arg(m_results)); - m_tabInfo->setCurrent(position); + bool isSent = true; + if(m_model->getSignPsbtWithHwiTool()) + { + QVariantMap variantMap = result.toMap(); + QString psbt = variantMap.value("psbt").toString(); + if(!HardwareSignTx::process(this, m_model, psbt, variantMap)) + isSent = false; + else + result = variantMap; + } + + if(isSent) + { + ContractResult *widgetResult = new ContractResult(ui->stackedWidget); + widgetResult->setResultData(result, FunctionABI(), m_ABIFunctionField->getParamsValues(), ContractResult::SendToResult); + ui->stackedWidget->addWidget(widgetResult); + int position = ui->stackedWidget->count() - 1; + m_results = position == 1 ? 1 : m_results + 1; + + m_tabInfo->addTab(position, tr("Result %1").arg(m_results)); + m_tabInfo->setCurrent(position); + } } } else diff --git a/src/qt/sendtokenpage.cpp b/src/qt/sendtokenpage.cpp index 83ebffb8f1..aa07608777 100644 --- a/src/qt/sendtokenpage.cpp +++ b/src/qt/sendtokenpage.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include static const CAmount SINGLE_STEP = 0.00000001*COIN; @@ -86,7 +87,7 @@ void SendTokenPage::setModel(WalletModel *_model) // update the display unit, to not use the default ("QTUM") updateDisplayUnit(); - bCreateUnsigned = m_model->wallet().privateKeysDisabled(); + bCreateUnsigned = m_model->createUnsigned(); if (bCreateUnsigned) { ui->confirmButton->setText(tr("Cr&eate Unsigned")); @@ -219,15 +220,32 @@ void SendTokenPage::on_confirmClicked() } else { - interfaces::TokenTx tokenTx; - tokenTx.contract_address = m_selectedToken->address; - tokenTx.sender_address = m_selectedToken->sender; - tokenTx.receiver_address = toAddress; - dev::u256 nValue(amountToSend); - tokenTx.value = u256Touint(nValue); - tokenTx.tx_hash = uint256S(m_tokenABI->getTxId()); - tokenTx.label = label; - m_model->wallet().addTokenTxEntry(tokenTx); + bool isSent = true; + if(m_model->getSignPsbtWithHwiTool()) + { + QVariantMap variantMap; + QString psbt = QString::fromStdString(m_tokenABI->getPsbt()); + if(!HardwareSignTx::process(this, m_model, psbt, variantMap)) + isSent = false; + else + { + std::string txid = variantMap["txid"].toString().toStdString(); + m_tokenABI->setTxId(txid); + } + } + + if(isSent) + { + interfaces::TokenTx tokenTx; + tokenTx.contract_address = m_selectedToken->address; + tokenTx.sender_address = m_selectedToken->sender; + tokenTx.receiver_address = toAddress; + dev::u256 nValue(amountToSend); + tokenTx.value = u256Touint(nValue); + tokenTx.tx_hash = uint256S(m_tokenABI->getTxId()); + tokenTx.label = label; + m_model->wallet().addTokenTxEntry(tokenTx); + } } } else diff --git a/src/qt/splitutxopage.cpp b/src/qt/splitutxopage.cpp index fe2b15940b..59b4640c86 100644 --- a/src/qt/splitutxopage.cpp +++ b/src/qt/splitutxopage.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include namespace SplitUTXO_NS @@ -109,7 +110,7 @@ void SplitUTXOPage::setModel(WalletModel *_model) // update the display unit, to not use the default ("QTUM") updateDisplayUnit(); - bCreateUnsigned = m_model->wallet().privateKeysDisabled(); + bCreateUnsigned = m_model->createUnsigned(); if (bCreateUnsigned) { ui->splitCoinsButton->setText(tr("Cr&eate Unsigned")); @@ -254,27 +255,38 @@ void SplitUTXOPage::on_splitCoinsClicked() Q_EMIT message(tr("PSBT copied"), "Copied to clipboard", CClientUIInterface::MSG_INFORMATION); } - QString selectedString = variantMap.value("selected").toString(); - CAmount selected; - BitcoinUnits::parse(unit, selectedString, &selected); + bool isOk = true; + if(m_model->getSignPsbtWithHwiTool()) + { + QString psbt = variantMap.value("psbt").toString(); + if(!HardwareSignTx::process(this, m_model, psbt, variantMap)) + isOk = false; + } - QString splitedString = variantMap.value("splited").toString(); - CAmount splited; - BitcoinUnits::parse(unit, splitedString, &splited); + if(isOk) + { + QString selectedString = variantMap.value("selected").toString(); + CAmount selected; + BitcoinUnits::parse(unit, selectedString, &selected); - int displayUnit = m_model->getOptionsModel()->getDisplayUnit(); + QString splitedString = variantMap.value("splited").toString(); + CAmount splited; + BitcoinUnits::parse(unit, splitedString, &splited); - QString infoString = tr("Selected: %1 less than %2 and above of %3."). - arg(BitcoinUnits::formatHtmlWithUnit(displayUnit, selected)). - arg(BitcoinUnits::formatHtmlWithUnit(displayUnit, minValue)). - arg(BitcoinUnits::formatHtmlWithUnit(displayUnit, maxValue)); - infoString.append("

"); - infoString.append(tr("Splitted: %1.").arg(BitcoinUnits::formatHtmlWithUnit(displayUnit, splited))); + int displayUnit = m_model->getOptionsModel()->getDisplayUnit(); - QMessageBox::information(this, tr("Split coins for address"), infoString); + QString infoString = tr("Selected: %1 less than %2 and above of %3."). + arg(BitcoinUnits::formatHtmlWithUnit(displayUnit, selected)). + arg(BitcoinUnits::formatHtmlWithUnit(displayUnit, minValue)). + arg(BitcoinUnits::formatHtmlWithUnit(displayUnit, maxValue)); + infoString.append("

"); + infoString.append(tr("Splitted: %1.").arg(BitcoinUnits::formatHtmlWithUnit(displayUnit, splited))); - if(splited == selected || splited == 0 || bCreateUnsigned) - accept(); + QMessageBox::information(this, tr("Split coins for address"), infoString); + + if(splited == selected || splited == 0 || bCreateUnsigned) + accept(); + } } } } diff --git a/src/qt/token.cpp b/src/qt/token.cpp index 8ea7e5cf12..3dcb5964d8 100755 --- a/src/qt/token.cpp +++ b/src/qt/token.cpp @@ -272,6 +272,11 @@ std::string Token::getPsbt() return d->psbt; } +void Token::setTxId(const std::string& txid) +{ + d->txid = txid; +} + bool Token::name(std::string &result, bool sendTo) { std::vector input; diff --git a/src/qt/token.h b/src/qt/token.h index f7f8191b7e..ad5079682a 100755 --- a/src/qt/token.h +++ b/src/qt/token.h @@ -52,6 +52,9 @@ class Token std::string getPsbt(); std::string getErrorMessage(); + // Set transaction data + void setTxId(const std::string& txid); + // ABI Functions bool name(std::string& result, bool sendTo = false); bool approve(const std::string& _spender, const std::string& _value, bool& success, bool sendTo = false); diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index a45a176507..6c29128e7e 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -893,6 +893,9 @@ void WalletModel::importAddressesData(bool _rescan, bool _importPKH, bool _impor bool WalletModel::getSignPsbtWithHwiTool() { + if(!::Params().HasHardwareWalletSupport()) + return false; + return wallet().privateKeysDisabled() && gArgs.GetBoolArg("-signpsbtwithhwitool", DEFAULT_SIGN_PSBT_WITH_HWI_TOOL); } @@ -900,6 +903,9 @@ bool WalletModel::createUnsigned() { if(wallet().privateKeysDisabled()) { + if(!::Params().HasHardwareWalletSupport()) + return true; + QString hwiToolPath = GUIUtil::getHwiToolPath(); if(QFile::exists(hwiToolPath)) { diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index d8bbaa7b97..e7708c646b 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -1131,6 +1131,12 @@ static UniValue createcontract(const JSONRPCRequest& request){ CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); ssTx << psbtx; result.pushKV("psbt", EncodeBase64((unsigned char*)ssTx.data(), ssTx.size())); + + // Add sender information + CTxDestination txSenderAdress(txSenderDest); + CKeyID keyid = GetKeyForDestination(spk_man, txSenderAdress); + result.pushKV("sender", EncodeDestination(txSenderAdress)); + result.pushKV("hash160", HexStr(valtype(keyid.begin(),keyid.end()))); } else if(fBroadcast){ pwallet->CommitTransaction(tx, {}, {}); @@ -1399,6 +1405,12 @@ UniValue SendToContract(interfaces::Chain::Lock& locked_chain, CWallet* const pw CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); ssTx << psbtx; result.pushKV("psbt", EncodeBase64((unsigned char*)ssTx.data(), ssTx.size())); + + // Add sender information + CTxDestination txSenderAdress(txSenderDest); + CKeyID keyid = GetKeyForDestination(spk_man, txSenderAdress); + result.pushKV("sender", EncodeDestination(txSenderAdress)); + result.pushKV("hash160", HexStr(valtype(keyid.begin(),keyid.end()))); } else if(fBroadcast){ pwallet->CommitTransaction(tx, {}, {}); diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index 5a723be372..eba54244e4 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -110,7 +110,7 @@ static const CAmount DEFAULT_STAKER_MIN_UTXO_SIZE = 0; static const int32_t DEFAULT_STAKER_MAX_UTXO_SCRIPT_CACHE = 200000; //! -signpsbtwithhwitool default -static const bool DEFAULT_SIGN_PSBT_WITH_HWI_TOOL = false; +static const bool DEFAULT_SIGN_PSBT_WITH_HWI_TOOL = true; class CCoinControl; class COutput; From 0064742b8ec65cc223ce3b5e4c7910fd4fdadfd6 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Tue, 16 Feb 2021 13:28:52 +0100 Subject: [PATCH 090/164] Fix send coins dialog --- src/qt/sendcoinsdialog.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/qt/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp index 9db373a831..288e11dedf 100644 --- a/src/qt/sendcoinsdialog.cpp +++ b/src/qt/sendcoinsdialog.cpp @@ -196,6 +196,7 @@ void SendCoinsDialog::setModel(WalletModel *_model) // set default rbf checkbox state ui->optInRBF->setCheckState(Qt::Checked); + bCreateUnsigned = _model->createUnsigned(); if (bCreateUnsigned) { ui->sendButton->setText(tr("Cr&eate Unsigned")); ui->sendButton->setToolTip(tr("Creates a Partially Signed Qtum Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); @@ -214,8 +215,6 @@ void SendCoinsDialog::setModel(WalletModel *_model) ui->confTargetSelector->setCurrentIndex(getIndexForConfTarget(model->wallet().getConfirmTarget())); else ui->confTargetSelector->setCurrentIndex(getIndexForConfTarget(settings.value("nConfTarget").toInt())); - - bCreateUnsigned = _model->createUnsigned(); } } From 8ef04b5893f648cdf94bcacbc5a15d37d1a9786b Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Tue, 16 Feb 2021 15:28:12 +0100 Subject: [PATCH 091/164] Fix windows build --- src/qt/hardwaresigntx.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/qt/hardwaresigntx.cpp b/src/qt/hardwaresigntx.cpp index 39ae3a1e5f..75e1ffd762 100644 --- a/src/qt/hardwaresigntx.cpp +++ b/src/qt/hardwaresigntx.cpp @@ -10,6 +10,7 @@ #include #include +#include HardwareSignTx::HardwareSignTx(QWidget *_widget) : QObject(_widget) { From 2497bfd29936a94deeec9b6538d68580d2e33350 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Wed, 24 Feb 2021 12:34:33 +0100 Subject: [PATCH 092/164] Don't start the hardware wallet staking by default --- src/wallet/wallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 722b6b287e..79b6a32b64 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -4966,7 +4966,7 @@ void CWallet::postInitProcess() chain().requestMempoolTransactions(*this); // Start mine proof-of-stake blocks in the background - if (gArgs.GetBoolArg("-staking", DEFAULT_STAKE)) { + if (!IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS) && gArgs.GetBoolArg("-staking", DEFAULT_STAKE)) { StartStake(); } } From e2f0dcdf181e4c5c88febf00487da1cb0fec8406 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Wed, 24 Feb 2021 14:17:26 +0100 Subject: [PATCH 093/164] Add option for create not signed coinstake --- src/validation.cpp | 2 +- src/wallet/wallet.cpp | 73 ++++++++++++++++++++++++++++++------------- src/wallet/wallet.h | 7 +++-- 3 files changed, 57 insertions(+), 25 deletions(-) diff --git a/src/validation.cpp b/src/validation.cpp index e68c34c42f..ac71069e2b 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -4786,7 +4786,7 @@ bool SignBlock(std::shared_ptr pblock, CWallet& wallet, const CAmount& n nTimeBlock &= ~consensusParams.StakeTimestampMask(nHeight); if(!spk_man) return false; - if (wallet.CreateCoinStake(*locked_chain, *spk_man, pblock->nBits, nTotalFees, nTimeBlock, txCoinStake, key, setCoins, setSelectedCoins, setDelegateCoins, selectedOnly, vchPoD, headerPrevout)) + if (wallet.CreateCoinStake(*locked_chain, *spk_man, pblock->nBits, nTotalFees, nTimeBlock, txCoinStake, key, setCoins, setSelectedCoins, setDelegateCoins, selectedOnly, true, vchPoD, headerPrevout)) { if (nTimeBlock >= ::ChainActive().Tip()->GetMedianTimePast()+1) { diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 79b6a32b64..085d72a1dd 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -3386,7 +3386,7 @@ uint64_t CWallet::GetStakeWeight(interfaces::Chain::Lock& locked_chain, uint64_t return nWeight; } -bool CWallet::CreateCoinStakeFromMine(interfaces::Chain::Lock& locked_chain, const FillableSigningProvider& keystore, unsigned int nBits, const CAmount& nTotalFees, uint32_t nTimeBlock, CMutableTransaction& tx, CKey& key, std::set >& setCoins, std::vector& setSelectedCoins, bool selectedOnly, COutPoint& headerPrevout) +bool CWallet::CreateCoinStakeFromMine(interfaces::Chain::Lock& locked_chain, const FillableSigningProvider& keystore, unsigned int nBits, const CAmount& nTotalFees, uint32_t nTimeBlock, CMutableTransaction& tx, CKey& key, std::set >& setCoins, std::vector& setSelectedCoins, bool selectedOnly, bool sign, COutPoint& headerPrevout) { CBlockIndex* pindexPrev = ::ChainActive().Tip(); arith_uint256 bnTargetPerCoinDay; @@ -3476,12 +3476,13 @@ bool CWallet::CreateCoinStakeFromMine(interfaces::Chain::Lock& locked_chain, con // convert to pay to public key type uint160 hash160(vSolutions[0]); CKeyID pubKeyHash(hash160); - if (!keystore.GetKey(pubKeyHash, key)) + CPubKey pubKeyKernel; + if (!GetKernelKey(pubKeyHash, keystore, sign, pubKeyKernel, key)) { LogPrint(BCLog::COINSTAKE, "CreateCoinStake : failed to get key for kernel type=%d\n", whichType); break; // unable to find corresponding public key } - scriptPubKeyOut << key.GetPubKey().getvch() << OP_CHECKSIG; + scriptPubKeyOut << pubKeyKernel.getvch() << OP_CHECKSIG; aggregateScriptPubKeyHashKernel = scriptPubKeyKernel; } if (whichType == TX_PUBKEY) @@ -3490,13 +3491,14 @@ bool CWallet::CreateCoinStakeFromMine(interfaces::Chain::Lock& locked_chain, con CPubKey pubKey(vchPubKey); uint160 hash160(Hash160(vchPubKey)); CKeyID pubKeyHash(hash160); - if (!keystore.GetKey(pubKeyHash, key)) + CPubKey pubKeyKernel; + if (!GetKernelKey(pubKeyHash, keystore, sign, pubKeyKernel, key)) { LogPrint(BCLog::COINSTAKE, "CreateCoinStake : failed to get key for kernel type=%d\n", whichType); break; // unable to find corresponding public key } - if (key.GetPubKey() != pubKey) + if (pubKeyKernel != pubKey) { LogPrint(BCLog::COINSTAKE, "CreateCoinStake : invalid key for kernel type=%d\n", whichType); break; // keys mismatch @@ -3599,11 +3601,14 @@ bool CWallet::CreateCoinStakeFromMine(interfaces::Chain::Lock& locked_chain, con } // Sign the input coins - int nIn = 0; - for(const std::pair &pcoin : vwtxPrev) + if(sign) { - if (!SignSignature(keystore, *pcoin.first->tx, txNew, nIn++, SIGHASH_ALL)) - return error("CreateCoinStake : failed to sign coinstake"); + int nIn = 0; + for(const std::pair &pcoin : vwtxPrev) + { + if (!SignSignature(keystore, *pcoin.first->tx, txNew, nIn++, SIGHASH_ALL)) + return error("CreateCoinStake : failed to sign coinstake"); + } } // Successfully generated coinstake @@ -3611,7 +3616,7 @@ bool CWallet::CreateCoinStakeFromMine(interfaces::Chain::Lock& locked_chain, con return true; } -bool CWallet::CreateCoinStakeFromDelegate(interfaces::Chain::Lock& locked_chain, const FillableSigningProvider &keystore, unsigned int nBits, const CAmount& nTotalFees, uint32_t nTimeBlock, CMutableTransaction& tx, CKey& key, std::set >& setCoins, std::vector& setDelegateCoins, std::vector& vchPoD, COutPoint& headerPrevout) +bool CWallet::CreateCoinStakeFromDelegate(interfaces::Chain::Lock& locked_chain, const FillableSigningProvider &keystore, unsigned int nBits, const CAmount& nTotalFees, uint32_t nTimeBlock, CMutableTransaction& tx, CKey& key, std::set >& setCoins, std::vector& setDelegateCoins, bool sign, std::vector& vchPoD, COutPoint& headerPrevout) { CBlockIndex* pindexPrev = ::ChainActive().Tip(); arith_uint256 bnTargetPerCoinDay; @@ -3690,12 +3695,14 @@ bool CWallet::CreateCoinStakeFromDelegate(interfaces::Chain::Lock& locked_chain, if(!GetDelegationStaker(hash160, delegation)) return error("CreateCoinStake: Failed to find delegation"); - if (!keystore.GetKey(CKeyID(delegation.staker), key)) + CKeyID pubKeyHash(delegation.staker); + CPubKey pubKeyKernel; + if (!GetKernelKey(pubKeyHash, keystore, sign, pubKeyKernel, key)) { LogPrint(BCLog::COINSTAKE, "CreateCoinStake : failed to get staker key for kernel type=%d\n", whichType); break; // unable to find corresponding public key } - scriptPubKeyStaker << key.GetPubKey().getvch() << OP_CHECKSIG; + scriptPubKeyStaker << pubKeyKernel.getvch() << OP_CHECKSIG; } if (whichType == TX_PUBKEY) { @@ -3705,13 +3712,15 @@ bool CWallet::CreateCoinStakeFromDelegate(interfaces::Chain::Lock& locked_chain, if(!GetDelegationStaker(hash160, delegation)) return error("CreateCoinStake: Failed to find delegation"); - if (!keystore.GetKey(CKeyID(delegation.staker), key)) + CKeyID pubKeyHash(delegation.staker); + CPubKey pubKeyKernel; + if (!GetKernelKey(pubKeyHash, keystore, sign, pubKeyKernel, key)) { LogPrint(BCLog::COINSTAKE, "CreateCoinStake : failed to get staker key for kernel type=%d\n", whichType); break; // unable to find corresponding public key } - scriptPubKeyStaker << key.GetPubKey().getvch() << OP_CHECKSIG; + scriptPubKeyStaker < &pcoin : vwtxPrev) + if(sign) { - if (!SignSignature(keystore, *pcoin.first->tx, txNew, nIn++, SIGHASH_ALL)) - return error("CreateCoinStake : failed to sign coinstake"); + int nIn = 0; + for(const std::pair &pcoin : vwtxPrev) + { + if (!SignSignature(keystore, *pcoin.first->tx, txNew, nIn++, SIGHASH_ALL)) + return error("CreateCoinStake : failed to sign coinstake"); + } } // Successfully generated coinstake @@ -3864,17 +3876,17 @@ bool CWallet::CanSuperStake(const std::set >& setCoins, std::vector& setSelectedCoins, std::vector& setDelegateCoins, bool selectedOnly, std::vector& vchPoD, COutPoint& headerPrevout) +bool CWallet::CreateCoinStake(interfaces::Chain::Lock& locked_chain, const FillableSigningProvider& keystore, unsigned int nBits, const CAmount& nTotalFees, uint32_t nTimeBlock, CMutableTransaction& tx, CKey& key, std::set >& setCoins, std::vector& setSelectedCoins, std::vector& setDelegateCoins, bool selectedOnly, bool sign, std::vector& vchPoD, COutPoint& headerPrevout) { // Can super stake bool canSuperStake = CanSuperStake(setCoins, setDelegateCoins); // Create coinstake from coins that are delegated to me - if(canSuperStake && CreateCoinStakeFromDelegate(locked_chain, keystore, nBits, nTotalFees, nTimeBlock, tx, key, setCoins, setDelegateCoins, vchPoD, headerPrevout)) + if(canSuperStake && CreateCoinStakeFromDelegate(locked_chain, keystore, nBits, nTotalFees, nTimeBlock, tx, key, setCoins, setDelegateCoins, sign, vchPoD, headerPrevout)) return true; // Create coinstake from coins that are mine - if(setCoins.size() > 0 && CreateCoinStakeFromMine(locked_chain, keystore, nBits, nTotalFees, nTimeBlock, tx, key, setCoins, setSelectedCoins, selectedOnly, headerPrevout)) + if(setCoins.size() > 0 && CreateCoinStakeFromMine(locked_chain, keystore, nBits, nTotalFees, nTimeBlock, tx, key, setCoins, setSelectedCoins, selectedOnly, sign, headerPrevout)) return true; // Fail to create coinstake @@ -6377,3 +6389,22 @@ bool CWallet::GetHDKeyPath(const CTxDestination &dest, std::string &hdkeypath) c return false; } + +bool CWallet::GetKernelKey(const CKeyID &pubKeyHash, const FillableSigningProvider &keystore, bool canSign, CPubKey &pubKeyKernel, CKey &keyKernel) const +{ + bool found = false; + if(canSign) + { + found = keystore.GetKey(pubKeyHash, keyKernel); + if(found) + { + pubKeyKernel = keyKernel.GetPubKey(); + } + } + else + { + found = keystore.GetPubKey(pubKeyHash, pubKeyKernel); + } + + return found; +} diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index eba54244e4..ab20974191 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -771,11 +771,12 @@ class CWallet final : public WalletStorage, public interfaces::Chain::Notificati boost::thread_group* stakeThread = nullptr; void StakeQtums(bool fStake, CConnman* connman); - bool CreateCoinStakeFromMine(interfaces::Chain::Lock& locked_chain, const FillableSigningProvider &keystore, unsigned int nBits, const CAmount& nTotalFees, uint32_t nTimeBlock, CMutableTransaction& tx, CKey& key, std::set >& setCoins, std::vector& setSelectedCoins, bool selectedOnly, COutPoint& headerPrevout); - bool CreateCoinStakeFromDelegate(interfaces::Chain::Lock& locked_chain, const FillableSigningProvider &keystore, unsigned int nBits, const CAmount& nTotalFees, uint32_t nTimeBlock, CMutableTransaction& tx, CKey& key, std::set >& setCoins, std::vector& setDelegateCoins, std::vector& vchPoD, COutPoint& headerPrevout); + bool CreateCoinStakeFromMine(interfaces::Chain::Lock& locked_chain, const FillableSigningProvider &keystore, unsigned int nBits, const CAmount& nTotalFees, uint32_t nTimeBlock, CMutableTransaction& tx, CKey& key, std::set >& setCoins, std::vector& setSelectedCoins, bool selectedOnly, bool sign, COutPoint& headerPrevout); + bool CreateCoinStakeFromDelegate(interfaces::Chain::Lock& locked_chain, const FillableSigningProvider &keystore, unsigned int nBits, const CAmount& nTotalFees, uint32_t nTimeBlock, CMutableTransaction& tx, CKey& key, std::set >& setCoins, std::vector& setDelegateCoins, bool sign, std::vector& vchPoD, COutPoint& headerPrevout); bool GetDelegationStaker(const uint160& keyid, Delegation& delegation); const CWalletTx* GetCoinSuperStaker(const std::set >& setCoins, const PKHash& superStaker, COutPoint& prevout, CAmount& nValueRet); const CScriptCache& GetScriptCache(const COutPoint& prevout, const CScript& scriptPubKey, std::map* insertScriptCache = nullptr) const; + bool GetKernelKey(const CKeyID& pubKeyHash, const FillableSigningProvider &keystore, bool canSign, CPubKey& pubKeyKernel, CKey& keyKernel) const; public: /* @@ -1072,7 +1073,7 @@ class CWallet final : public WalletStorage, public interfaces::Chain::Notificati uint64_t GetStakeWeight(interfaces::Chain::Lock& locked_chain, uint64_t* pStakerWeight = nullptr, uint64_t* pDelegateWeight = nullptr) const; uint64_t GetSuperStakerWeight(const uint160& staker) const; - bool CreateCoinStake(interfaces::Chain::Lock& locked_chain, const FillableSigningProvider &keystore, unsigned int nBits, const CAmount& nTotalFees, uint32_t nTimeBlock, CMutableTransaction& tx, CKey& key, std::set >& setCoins, std::vector& setSelectedCoins, std::vector& setDelegateCoins, bool selectedOnly, std::vector& vchPoD, COutPoint& headerPrevout); + bool CreateCoinStake(interfaces::Chain::Lock& locked_chain, const FillableSigningProvider &keystore, unsigned int nBits, const CAmount& nTotalFees, uint32_t nTimeBlock, CMutableTransaction& tx, CKey& key, std::set >& setCoins, std::vector& setSelectedCoins, std::vector& setDelegateCoins, bool selectedOnly, bool sign, std::vector& vchPoD, COutPoint& headerPrevout); bool CanSuperStake(const std::set >& setCoins, const std::vector& setDelegateCoins) const; void UpdateMinerStakeCache(bool fStakeCache, const std::vector& prevouts, CBlockIndex* pindexPrev); bool GetSenderDest(const CTransaction& tx, CTxDestination& txSenderDest, bool sign=true) const; From 9ef9d65ddd20fc86458886a2874d28e3b1458c96 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Wed, 24 Feb 2021 15:41:22 +0100 Subject: [PATCH 094/164] Add empty method for sign with hwi --- src/validation.cpp | 10 ++++++++-- src/wallet/wallet.cpp | 3 ++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/validation.cpp b/src/validation.cpp index ac71069e2b..2dec75c8d4 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -4756,6 +4756,11 @@ bool CheckFirstCoinstakeOutput(const CBlock& block) } #ifdef ENABLE_WALLET +bool SignBlockHWI(std::shared_ptr pblock, CWallet& wallet, std::vector& vchSig) +{ + return false; +} + // novacoin: attempt to generate suitable proof-of-stake bool SignBlock(std::shared_ptr pblock, CWallet& wallet, const CAmount& nTotalFees, uint32_t nTime, std::set >& setCoins, std::vector& setSelectedCoins, std::vector& setDelegateCoins, bool selectedOnly, bool tryOnly) { @@ -4786,7 +4791,8 @@ bool SignBlock(std::shared_ptr pblock, CWallet& wallet, const CAmount& n nTimeBlock &= ~consensusParams.StakeTimestampMask(nHeight); if(!spk_man) return false; - if (wallet.CreateCoinStake(*locked_chain, *spk_man, pblock->nBits, nTotalFees, nTimeBlock, txCoinStake, key, setCoins, setSelectedCoins, setDelegateCoins, selectedOnly, true, vchPoD, headerPrevout)) + bool privateKeysDisabled = wallet.IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS); + if (wallet.CreateCoinStake(*locked_chain, *spk_man, pblock->nBits, nTotalFees, nTimeBlock, txCoinStake, key, setCoins, setSelectedCoins, setDelegateCoins, selectedOnly, !privateKeysDisabled, vchPoD, headerPrevout)) { if (nTimeBlock >= ::ChainActive().Tip()->GetMedianTimePast()+1) { @@ -4815,7 +4821,7 @@ bool SignBlock(std::shared_ptr pblock, CWallet& wallet, const CAmount& n // append a signature to our block and ensure that is compact std::vector vchSig; - bool isSigned = key.SignCompact(pblock->GetHashWithoutSign(), vchSig); + bool isSigned = privateKeysDisabled ? SignBlockHWI(pblock, wallet, vchSig) : key.SignCompact(pblock->GetHashWithoutSign(), vchSig); pblock->SetBlockSignature(vchSig); // check block header diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 085d72a1dd..a6eb87e140 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -4978,8 +4978,9 @@ void CWallet::postInitProcess() chain().requestMempoolTransactions(*this); // Start mine proof-of-stake blocks in the background - if (!IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS) && gArgs.GetBoolArg("-staking", DEFAULT_STAKE)) { + if (gArgs.GetBoolArg("-staking", DEFAULT_STAKE)) { StartStake(); + m_enabled_staking = !IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS); } } From 796a48a7ea55c50b59c5cb592d184c7f719c74d3 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 25 Feb 2021 09:28:10 +0100 Subject: [PATCH 095/164] Update stake display for hardware wallet --- src/miner.cpp | 21 ++++++++++++++++++--- src/qt/stakepage.cpp | 11 +++++++++-- src/wallet/wallet.cpp | 5 ++++- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index 1914a3c2b8..fb1ea903a6 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -928,9 +928,11 @@ class DelegationsStaker : public DelegationFilterBase pwallet(_pwallet), cacheHeight(0), type(StakerType::STAKER_NORMAL), - spk_man(0) + spk_man(0), + privateKeysDisabled(false) { spk_man = _pwallet->GetLegacyScriptPubKeyMan(); + privateKeysDisabled = _pwallet->IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS); // Get allow list for (const std::string& strAddress : gArgs.GetArgs("-stakingallowlist")) @@ -975,7 +977,15 @@ class DelegationsStaker : public DelegationFilterBase bool Match(const DelegationEvent& event) const { - bool mine = spk_man->HaveKey(CKeyID(event.item.staker)); + bool mine = false; + if(privateKeysDisabled) + { + mine = pwallet->IsMine(PKHash(event.item.staker)); + } + else + { + mine = spk_man->HaveKey(CKeyID(event.item.staker)); + } if(!mine) return false; @@ -1053,6 +1063,7 @@ class DelegationsStaker : public DelegationFilterBase std::vector excludeList; int type; LegacyScriptPubKeyMan* spk_man; + bool privateKeysDisabled; }; class MyDelegations : public DelegationFilterBase @@ -1287,6 +1298,7 @@ class StakeMinerPriv int numThreads = 1; boost::thread_group threads; mutable RecursiveMutex cs_worker; + bool privateKeysDisabled = false;; public: DelegationsStaker delegationsStaker; @@ -1342,6 +1354,7 @@ class StakeMinerPriv fEmergencyStaking = gArgs.GetBoolArg("-emergencystaking", false); fAggressiveStaking = gArgs.IsArgSet("-aggressive-staking"); if(pwallet) numThreads = pwallet->m_num_threads; + if(pwallet) privateKeysDisabled = pwallet->IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS); } void clearCache() @@ -1532,7 +1545,9 @@ class StakeMiner : public IStakeMiner LOCK(d->pwallet->cs_wallet); d->clearCache(); - CAmount nBalance = d->pwallet->GetBalance().m_mine_trusted; + const auto bal = d->pwallet->GetBalance(); + CAmount nBalance = bal.m_mine_trusted; + if(d->privateKeysDisabled) nBalance += bal.m_watchonly_trusted; d->nTargetValue = nBalance - d->pwallet->m_reserve_balance; CAmount nValueIn = 0; d->pindexPrev = ::ChainActive().Tip(); diff --git a/src/qt/stakepage.cpp b/src/qt/stakepage.cpp index 1063bbee32..f0cc826997 100644 --- a/src/qt/stakepage.cpp +++ b/src/qt/stakepage.cpp @@ -87,8 +87,15 @@ void StakePage::setBalance(const interfaces::WalletBalances& balances) { int unit = walletModel->getOptionsModel()->getDisplayUnit(); m_balances = balances; - ui->labelAssets->setText(BitcoinUnits::formatWithUnit(unit, balances.balance, false, BitcoinUnits::separatorAlways)); - ui->labelStake->setText(BitcoinUnits::formatWithUnit(unit, balances.stake, false, BitcoinUnits::separatorAlways)); + CAmount balance = balances.balance; + CAmount stake = balances.stake; + if(walletModel->wallet().privateKeysDisabled()) + { + balance += balances.watch_only_balance; + stake += balances.watch_only_stake; + } + ui->labelAssets->setText(BitcoinUnits::formatWithUnit(unit, balance, false, BitcoinUnits::separatorAlways)); + ui->labelStake->setText(BitcoinUnits::formatWithUnit(unit, stake, false, BitcoinUnits::separatorAlways)); } void StakePage::on_checkStake_clicked(bool checked) diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index a6eb87e140..68ffe6f738 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -3330,7 +3330,10 @@ uint64_t CWallet::GetStakeWeight(interfaces::Chain::Lock& locked_chain, uint64_t if(pDelegateWeight) *pDelegateWeight = nDelegateWeight; // Choose coins to use - CAmount nBalance = GetBalance().m_mine_trusted; + const auto bal = GetBalance(); + CAmount nBalance = bal.m_mine_trusted; + if(IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS)) + nBalance += bal.m_watchonly_trusted; if (nBalance <= m_reserve_balance) return nWeight; From 55070aae8b3f71c7a1d53281584e5060cb41a1a4 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 25 Feb 2021 10:55:31 +0100 Subject: [PATCH 096/164] Fix reserve balance check for hardware wallet --- src/wallet/wallet.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 68ffe6f738..e5a91d370f 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -3405,7 +3405,10 @@ bool CWallet::CreateCoinStakeFromMine(interfaces::Chain::Lock& locked_chain, con txNew.vout.push_back(CTxOut(0, scriptEmpty)); // Choose coins to use - CAmount nBalance = GetBalance().m_mine_trusted; + const auto bal = GetBalance(); + CAmount nBalance = bal.m_mine_trusted; + if(IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS)) + nBalance += bal.m_watchonly_trusted; if (nBalance <= m_reserve_balance) return false; From 1c4ed544b6d8c4d5cd1aaae7bad7b8021eec21ea Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 25 Feb 2021 17:16:56 +0100 Subject: [PATCH 097/164] Update method sign block hwi --- src/Makefile.am | 4 ++- src/primitives/block.cpp | 8 ++++++ src/primitives/block.h | 2 ++ src/qtum/qtumledger.cpp | 31 +++++++++++++++++++++ src/qtum/qtumledger.h | 47 ++++++++++++++++++++++++++++++++ src/validation.cpp | 58 +++++++++++++++++++++++++++++++++++++++- src/wallet/wallet.h | 1 + 7 files changed, 149 insertions(+), 2 deletions(-) create mode 100644 src/qtum/qtumledger.cpp create mode 100644 src/qtum/qtumledger.h diff --git a/src/Makefile.am b/src/Makefile.am index acfc50ea47..53cb85e37a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -274,7 +274,8 @@ BITCOIN_CORE_H = \ qtum/qtumDGP.h \ qtum/storageresults.h \ qtum/qtumutils.h \ - qtum/qtumdelegation.h + qtum/qtumdelegation.h \ + qtum/qtumledger.h obj/build.h: FORCE @$(MKDIR_P) $(builddir)/obj @@ -343,6 +344,7 @@ libbitcoin_server_a_SOURCES = \ consensus/consensus.cpp \ qtum/storageresults.cpp \ qtum/qtumdelegation.cpp \ + qtum/qtumledger.cpp \ $(BITCOIN_CORE_H) if ENABLE_WALLET diff --git a/src/primitives/block.cpp b/src/primitives/block.cpp index f9b09c5bc3..0baaec8072 100644 --- a/src/primitives/block.cpp +++ b/src/primitives/block.cpp @@ -10,6 +10,7 @@ #include #include #include +#include // Used to serialize the header without signature // Workaround due to removing serialization templates in Bitcoin Core 0.18 @@ -76,6 +77,13 @@ uint256 CBlockHeader::GetHashWithoutSign() const return SerializeHash(CBlockHeaderSign(*this), SER_GETHASH); } +std::string CBlockHeader::GetWithoutSign() const +{ + CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); + ss << CBlockHeaderSign(*this); + return EncodeBase64(ss.str()); +} + std::string CBlock::ToString() const { std::stringstream s; diff --git a/src/primitives/block.h b/src/primitives/block.h index f13931faeb..1e001d11f4 100644 --- a/src/primitives/block.h +++ b/src/primitives/block.h @@ -76,6 +76,8 @@ class CBlockHeader uint256 GetHashWithoutSign() const; + std::string GetWithoutSign() const; + int64_t GetBlockTime() const { return (int64_t)nTime; diff --git a/src/qtum/qtumledger.cpp b/src/qtum/qtumledger.cpp new file mode 100644 index 0000000000..bdb35a1ab1 --- /dev/null +++ b/src/qtum/qtumledger.cpp @@ -0,0 +1,31 @@ +#include + +class QtumLedgerPriv +{ +public: + QtumLedgerPriv() + {} +}; + +QtumLedger::QtumLedger(): + priv(0) +{ + priv = new QtumLedgerPriv(); +} + +QtumLedger::~QtumLedger() +{ + if(priv) + delete priv; + priv = 0; +} + +bool QtumLedger::signCoinStake(const std::string &fingerprint, std::string &psbt) +{ + return false; +} + +bool QtumLedger::signBlockHeader(const std::string &fingerprint, const std::string &header, std::vector &vchSig) +{ + return false; +} diff --git a/src/qtum/qtumledger.h b/src/qtum/qtumledger.h new file mode 100644 index 0000000000..d9d8cddc93 --- /dev/null +++ b/src/qtum/qtumledger.h @@ -0,0 +1,47 @@ +#ifndef QTUMLEDGER_H +#define QTUMLEDGER_H + +#include +#include + +class QtumLedgerPriv; + +/** + * @brief The QtumLedger class Communicate with the qtum ledger + */ +class QtumLedger { + +public: + /** + * @brief QtumLedger Constructor + */ + QtumLedger(); + + /** + * @brief ~QtumLedger Destructor + */ + virtual ~QtumLedger(); + + /** + * @brief signCoinStake Sign proof of stake transaction + * @param fingerprint Fingerprint of the ledger + * @param psbt Proof of stake transaction + * @return true/false + */ + bool signCoinStake(const std::string& fingerprint, std::string& psbt); + + /** + * @brief signBlockHeader Sign block header + * @param fingerprint Fingerprint of the ledger + * @param header Block header for the new block + * @param vchSig Signature + * @return true/false + */ + bool signBlockHeader(const std::string& fingerprint, const std::string& header, std::vector& vchSig); + +private: + QtumLedger(const QtumLedger&); + QtumLedger& operator=(const QtumLedger&); + QtumLedgerPriv* priv; +}; +#endif diff --git a/src/validation.cpp b/src/validation.cpp index 2dec75c8d4..69f245d946 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -57,6 +57,7 @@ #include #include #include +#include #include #include @@ -4758,7 +4759,62 @@ bool CheckFirstCoinstakeOutput(const CBlock& block) #ifdef ENABLE_WALLET bool SignBlockHWI(std::shared_ptr pblock, CWallet& wallet, std::vector& vchSig) { - return false; + // Check ledger ID + if(wallet.m_ledger_id == "") { + return false; + } + static QtumLedger device; + + // Make a blank psbt + PartiallySignedTransaction psbtx_in; + CMutableTransaction rawTx = CMutableTransaction(*pblock->vtx[1]); + psbtx_in.tx = rawTx; + for (unsigned int i = 0; i < rawTx.vin.size(); ++i) { + psbtx_in.inputs.push_back(PSBTInput()); + } + for (unsigned int i = 0; i < rawTx.vout.size(); ++i) { + psbtx_in.outputs.push_back(PSBTOutput()); + } + + // Fill transaction with out data but don't sign + bool bip32derivs = true; + bool complete = true; + const TransactionError err = wallet.FillPSBT(psbtx_in, complete, 1, false, bip32derivs); + if (err != TransactionError::OK) { + return false; + } + + // Serialize the PSBT + CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); + ssTx << psbtx_in; + std::string psbt = EncodeBase64((unsigned char*)ssTx.data(), ssTx.size()); + if(!device.signCoinStake(wallet.m_ledger_id, psbt)) { + return false; + } + + // Unserialize the transactions + PartiallySignedTransaction psbtx_out; + std::string error; + if (!DecodeBase64PSBT(psbtx_out, psbt, error)) { + return false; + } + + // Update block proof + CMutableTransaction txCoinStake; + complete = FinalizeAndExtractPSBT(psbtx_out, txCoinStake); + if(!complete) { + return false; + } + pblock->vtx[1] = MakeTransactionRef(std::move(txCoinStake)); + pblock->hashMerkleRoot = BlockMerkleRoot(*pblock); + + // Sign block header + std::string header = pblock->GetWithoutSign(); + if(!device.signBlockHeader(wallet.m_ledger_id, header, vchSig)) { + return false; + } + + return true; } // novacoin: attempt to generate suitable proof-of-stake diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index ab20974191..ba9ea358da 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -1442,6 +1442,7 @@ class CWallet final : public WalletStorage, public interfaces::Chain::Notificati std::map m_have_coin_superstaker; int m_num_threads = 1; mutable boost::thread_group threads; + std::string m_ledger_id; }; /** From 20750d6d5889c38daa0307629c13cc9be6e573bb Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 26 Feb 2021 14:10:37 +0100 Subject: [PATCH 098/164] Add create process support from qtumd without using Qt --- src/qtum/qtumledger.cpp | 192 ++++++++++++++++++++++++++++++++++++++-- src/qtum/qtumledger.h | 9 +- 2 files changed, 193 insertions(+), 8 deletions(-) diff --git a/src/qtum/qtumledger.cpp b/src/qtum/qtumledger.cpp index bdb35a1ab1..40b6bb6cac 100644 --- a/src/qtum/qtumledger.cpp +++ b/src/qtum/qtumledger.cpp @@ -1,31 +1,209 @@ #include +#include +#include +#include +#include +#include + +namespace QtumLedger_NS { +// Read json document +UniValue json_read_doc(const std::string& jsondata) +{ + UniValue v; + v.read(jsondata); + return v; +} + +// Read json object +UniValue json_get_object(const UniValue& jsondata) +{ + UniValue v(UniValue::VOBJ); + if(jsondata.isObject()) + v = jsondata.get_obj(); + return v; +} + +// Get json string for key +std::string json_get_key_string(const UniValue& jsondata, std::string key) +{ + UniValue v(UniValue::VSTR); + if(jsondata.exists(key)) + { + UniValue data = jsondata[key]; + if(data.isStr()) + v = data; + } + + return v.get_str(); +} + +// Append data to vector +std::vector& operator<<(std::vector& os, const std::string& dt) +{ + os.push_back(dt); + return os; +} + +// Start process from qtumd +class CProcess +{ +public: + ~CProcess() + { + clean(); + } + + // Set process params + void start(const std::string& prog, const std::vector &arg) + { + clean(); + m_program = prog; + m_arguments = arg; + } + + // Start and wait for it to finish + void waitForFinished() + { + boost::asio::io_service svc; + boost::asio::streambuf out, err; + boost::process::child child(m_program, boost::process::args(m_arguments), + boost::process::std_out > out, boost::process::std_err > err, svc); + + svc.run(); + child.wait(); + m_std_out = toString(&out); + m_std_err = toString(&err); + } + + // Read all standard output + std::string readAllStandardOutput() + { + return m_std_out; + } + + // Read all standard error + std::string readAllStandardError() + { + return m_std_err; + } + + // Clean process + void clean() + { + m_program = ""; + m_std_out = ""; + m_std_err = ""; + } + + +private: + std::string toString(boost::asio::streambuf* stream) + { + std::istream is(stream); + std::ostringstream os; + is >> os.rdbuf(); + return os.str(); + } + +private: + std::string m_program; + std::vector m_arguments; + std::string m_std_out; + std::string m_std_err; +}; +} +using namespace QtumLedger_NS; class QtumLedgerPriv { public: QtumLedgerPriv() - {} + { + toolPath = gArgs.GetArg("-hwitoolpath", ""); + if(gArgs.GetChainName() != CBaseChainParams::MAIN) + { + arguments << "--testnet"; + } + } + + std::atomic fStarted{false}; + CProcess process; + std::string strStdout; + std::string strError; + std::string toolPath; + std::vector arguments; }; QtumLedger::QtumLedger(): - priv(0) + d(0) { - priv = new QtumLedgerPriv(); + d = new QtumLedgerPriv(); } QtumLedger::~QtumLedger() { - if(priv) - delete priv; - priv = 0; + if(d) + delete d; + d = 0; } bool QtumLedger::signCoinStake(const std::string &fingerprint, std::string &psbt) { - return false; + // Sign PSBT transaction + if(isStarted()) + return false; + + if(!beginSignTx(fingerprint, psbt)) + return false; + + wait(); + + return endSignTx(fingerprint, psbt); } bool QtumLedger::signBlockHeader(const std::string &fingerprint, const std::string &header, std::vector &vchSig) { return false; } + +bool QtumLedger::isStarted() +{ + return d->fStarted; +} + +void QtumLedger::wait() +{ + if(d->fStarted) + { + d->process.waitForFinished(); + d->strStdout = d->process.readAllStandardOutput(); + d->strError = d->process.readAllStandardError(); + d->fStarted = false; + } +} + +bool QtumLedger::beginSignTx(const std::string &fingerprint, std::string &psbt) +{ + // Execute command line + std::vector arguments = d->arguments; + arguments << "-f" << fingerprint << "signtx" << psbt; + d->process.start(d->toolPath, arguments); + d->fStarted = true; + + return d->fStarted; +} + +bool QtumLedger::endSignTx(const std::string &, std::string &psbt) +{ + // Decode command line results + UniValue jsonDocument = json_read_doc(d->strStdout); + UniValue data = json_get_object(jsonDocument); + std::string psbtSigned = json_get_key_string(data, "psbt"); + if(!psbtSigned.empty()) + { + psbt = psbtSigned; + return true; + } + + return false; +} diff --git a/src/qtum/qtumledger.h b/src/qtum/qtumledger.h index d9d8cddc93..d9bd5d2845 100644 --- a/src/qtum/qtumledger.h +++ b/src/qtum/qtumledger.h @@ -39,9 +39,16 @@ class QtumLedger { */ bool signBlockHeader(const std::string& fingerprint, const std::string& header, std::vector& vchSig); +private: + bool isStarted(); + void wait(); + + bool beginSignTx(const std::string& fingerprint, std::string& psbt); + bool endSignTx(const std::string& fingerprint, std::string& psbt); + private: QtumLedger(const QtumLedger&); QtumLedger& operator=(const QtumLedger&); - QtumLedgerPriv* priv; + QtumLedgerPriv* d; }; #endif From 0e9180203f9eeb5bac21bec2eee16cfd23ccf0ac Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 26 Feb 2021 15:30:13 +0100 Subject: [PATCH 099/164] Check if tool exists --- src/qtum/qtumledger.cpp | 12 ++++++++++++ src/qtum/qtumledger.h | 1 + 2 files changed, 13 insertions(+) diff --git a/src/qtum/qtumledger.cpp b/src/qtum/qtumledger.cpp index 40b6bb6cac..ad57e4bb94 100644 --- a/src/qtum/qtumledger.cpp +++ b/src/qtum/qtumledger.cpp @@ -4,6 +4,7 @@ #include #include #include +#include namespace QtumLedger_NS { // Read json document @@ -120,6 +121,7 @@ class QtumLedgerPriv QtumLedgerPriv() { toolPath = gArgs.GetArg("-hwitoolpath", ""); + toolExists = boost::filesystem::exists(toolPath); if(gArgs.GetChainName() != CBaseChainParams::MAIN) { arguments << "--testnet"; @@ -132,6 +134,7 @@ class QtumLedgerPriv std::string strError; std::string toolPath; std::vector arguments; + bool toolExists = false; }; QtumLedger::QtumLedger(): @@ -149,6 +152,10 @@ QtumLedger::~QtumLedger() bool QtumLedger::signCoinStake(const std::string &fingerprint, std::string &psbt) { + // Check if tool exists + if(!toolExists()) + return false; + // Sign PSBT transaction if(isStarted()) return false; @@ -166,6 +173,11 @@ bool QtumLedger::signBlockHeader(const std::string &fingerprint, const std::stri return false; } +bool QtumLedger::toolExists() +{ + return d->toolExists; +} + bool QtumLedger::isStarted() { return d->fStarted; diff --git a/src/qtum/qtumledger.h b/src/qtum/qtumledger.h index d9bd5d2845..d924426114 100644 --- a/src/qtum/qtumledger.h +++ b/src/qtum/qtumledger.h @@ -40,6 +40,7 @@ class QtumLedger { bool signBlockHeader(const std::string& fingerprint, const std::string& header, std::vector& vchSig); private: + bool toolExists(); bool isStarted(); void wait(); From c17795424d64adda43c34243c4d5e67e498be113 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 26 Feb 2021 16:52:14 +0100 Subject: [PATCH 100/164] Add command line option for stakerledgerid --- src/wallet/init.cpp | 1 + src/wallet/wallet.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/wallet/init.cpp b/src/wallet/init.cpp index 8bc4c3a79a..dd500a5923 100644 --- a/src/wallet/init.cpp +++ b/src/wallet/init.cpp @@ -85,6 +85,7 @@ void WalletInit::AddWalletOptions() const gArgs.AddArg("-maxstakerutxoscriptcache=", strprintf("Set max staker utxo script cache for staking (default: %d)", DEFAULT_STAKER_MAX_UTXO_SCRIPT_CACHE), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); gArgs.AddArg("-stakerthreads=", strprintf("Set the number of threads the staker use for processing (default is the number of cores to your machine: %d)", GetNumCores()), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); gArgs.AddArg("-signpsbtwithhwitool", strprintf("Sign PSBT with HWI tool"), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); + gArgs.AddArg("-stakerledgerid=", strprintf("Set the ledger fingerprint to use for staking"), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); } bool WalletInit::ParameterInteraction() const diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index e5a91d370f..bbc1183a42 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -4834,6 +4834,7 @@ std::shared_ptr CWallet::CreateWalletFromFile(interfaces::Chain& chain, walletInstance->m_staker_max_utxo_script_cache = gArgs.GetArg("-maxstakerutxoscriptcache", DEFAULT_STAKER_MAX_UTXO_SCRIPT_CACHE); walletInstance->m_num_threads = gArgs.GetArg("-stakerthreads", GetNumCores()); walletInstance->m_num_threads = std::max(1, walletInstance->m_num_threads); + walletInstance->m_ledger_id = gArgs.GetArg("-stakerledgerid", ""); walletInstance->WalletLogPrintf("Wallet completed loading in %15dms\n", GetTimeMillis() - nStart); @@ -4986,7 +4987,6 @@ void CWallet::postInitProcess() // Start mine proof-of-stake blocks in the background if (gArgs.GetBoolArg("-staking", DEFAULT_STAKE)) { StartStake(); - m_enabled_staking = !IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS); } } @@ -5742,7 +5742,7 @@ void CWallet::StakeQtums(bool fStake, CConnman* connman) void CWallet::StartStake(CConnman *connman) { - m_enabled_staking = true; + m_enabled_staking = !IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS); StakeQtums(true, connman); } From 01085f849e78db009e157e536d9e25044bdd9ed0 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 22 Mar 2021 10:02:54 +0100 Subject: [PATCH 101/164] Add method for sign block header --- src/qtum/qtumledger.cpp | 43 ++++++++++++++++++++++++++++++++++++++++- src/qtum/qtumledger.h | 3 +++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/src/qtum/qtumledger.cpp b/src/qtum/qtumledger.cpp index ad57e4bb94..221f7cea5f 100644 --- a/src/qtum/qtumledger.cpp +++ b/src/qtum/qtumledger.cpp @@ -2,6 +2,8 @@ #include #include #include +#include +#include #include #include #include @@ -170,7 +172,20 @@ bool QtumLedger::signCoinStake(const std::string &fingerprint, std::string &psbt bool QtumLedger::signBlockHeader(const std::string &fingerprint, const std::string &header, std::vector &vchSig) { - return false; + // Check if tool exists + if(!toolExists()) + return false; + + // Sign block header + if(isStarted()) + return false; + + if(!beginSignBlockHeader(fingerprint, header, vchSig)) + return false; + + wait(); + + return endSignBlockHeader(fingerprint, header, vchSig); } bool QtumLedger::toolExists() @@ -219,3 +234,29 @@ bool QtumLedger::endSignTx(const std::string &, std::string &psbt) return false; } + +bool QtumLedger::beginSignBlockHeader(const std::string &fingerprint, const std::string &header, std::vector &) +{ + // Execute command line + std::vector arguments = d->arguments; + arguments << "-f" << fingerprint << "signheader" << header; + d->process.start(d->toolPath, arguments); + d->fStarted = true; + + return d->fStarted; +} + +bool QtumLedger::endSignBlockHeader(const std::string &, const std::string &, std::vector &vchSig) +{ + // Decode command line results + UniValue jsonDocument = json_read_doc(d->strStdout); + UniValue data = json_get_object(jsonDocument); + std::string headerSigned = json_get_key_string(data, "signature"); + if(!headerSigned.empty()) + { + vchSig = DecodeBase64(headerSigned.c_str()); + return vchSig.size() == CPubKey::COMPACT_SIGNATURE_SIZE; + } + + return false; +} diff --git a/src/qtum/qtumledger.h b/src/qtum/qtumledger.h index d924426114..b6dff483b8 100644 --- a/src/qtum/qtumledger.h +++ b/src/qtum/qtumledger.h @@ -47,6 +47,9 @@ class QtumLedger { bool beginSignTx(const std::string& fingerprint, std::string& psbt); bool endSignTx(const std::string& fingerprint, std::string& psbt); + bool beginSignBlockHeader(const std::string& fingerprint, const std::string& header, std::vector& vchSig); + bool endSignBlockHeader(const std::string& fingerprint, const std::string& header, std::vector& vchSig); + private: QtumLedger(const QtumLedger&); QtumLedger& operator=(const QtumLedger&); From 7b92ec5f19fb8704a55bb32b476e9f11f74cda18 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 22 Mar 2021 13:57:58 +0100 Subject: [PATCH 102/164] Update select coins for staking --- src/wallet/wallet.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index c47de6c992..22f6068fd0 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -6069,11 +6069,13 @@ bool CWallet::SelectCoinsForStaking(interfaces::Chain::Lock &locked_chain, CAmou int coinbaseMaturity = Params().GetConsensus().CoinbaseMaturity(nHeight); std::map immatureStakes = locked_chain.getImmatureStakes(); std::vector maturedTx; + const bool include_watch_only = GetLegacyScriptPubKeyMan() && IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS); + const isminetype is_mine_filter = include_watch_only ? ISMINE_WATCH_ONLY : ISMINE_SPENDABLE; for (std::map::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it) { // Check the cached data for available coins for the tx const CWalletTx* pcoin = &(*it).second; - const CAmount tx_credit_mine{pcoin->GetAvailableCredit(/* fUseCache */ true, ISMINE_SPENDABLE | ISMINE_NO)}; + const CAmount tx_credit_mine{pcoin->GetAvailableCredit(/* fUseCache */ true, is_mine_filter | ISMINE_NO)}; if(tx_credit_mine == 0) continue; @@ -6329,11 +6331,13 @@ void CWallet::AvailableAddress(const std::vector &maturedTx, size_t fro void CWallet::SelectAddress(interfaces::Chain::Lock &locked_chain, std::map &mapAddress) const { std::vector maturedTx; + const bool include_watch_only = GetLegacyScriptPubKeyMan() && IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS); + const isminetype is_mine_filter = include_watch_only ? ISMINE_WATCH_ONLY : ISMINE_SPENDABLE; for (std::map::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it) { // Check the cached data for available coins for the tx const CWalletTx* pcoin = &(*it).second; - const CAmount tx_credit_mine{pcoin->GetAvailableCredit(/* fUseCache */ true, ISMINE_SPENDABLE | ISMINE_NO)}; + const CAmount tx_credit_mine{pcoin->GetAvailableCredit(/* fUseCache */ true, is_mine_filter | ISMINE_NO)}; if(tx_credit_mine == 0) continue; From e93ce67a437dde38243519247d10a870ba0416bc Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 25 Mar 2021 12:18:54 +0100 Subject: [PATCH 103/164] Get staker path --- src/qtum/qtumledger.cpp | 12 ++++++------ src/qtum/qtumledger.h | 7 ++++--- src/validation.cpp | 10 +++++++++- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/qtum/qtumledger.cpp b/src/qtum/qtumledger.cpp index 221f7cea5f..d3c7d3b283 100644 --- a/src/qtum/qtumledger.cpp +++ b/src/qtum/qtumledger.cpp @@ -170,7 +170,7 @@ bool QtumLedger::signCoinStake(const std::string &fingerprint, std::string &psbt return endSignTx(fingerprint, psbt); } -bool QtumLedger::signBlockHeader(const std::string &fingerprint, const std::string &header, std::vector &vchSig) +bool QtumLedger::signBlockHeader(const std::string &fingerprint, const std::string &header, const std::string &path, std::vector &vchSig) { // Check if tool exists if(!toolExists()) @@ -180,12 +180,12 @@ bool QtumLedger::signBlockHeader(const std::string &fingerprint, const std::stri if(isStarted()) return false; - if(!beginSignBlockHeader(fingerprint, header, vchSig)) + if(!beginSignBlockHeader(fingerprint, header, path, vchSig)) return false; wait(); - return endSignBlockHeader(fingerprint, header, vchSig); + return endSignBlockHeader(fingerprint, header, path, vchSig); } bool QtumLedger::toolExists() @@ -235,18 +235,18 @@ bool QtumLedger::endSignTx(const std::string &, std::string &psbt) return false; } -bool QtumLedger::beginSignBlockHeader(const std::string &fingerprint, const std::string &header, std::vector &) +bool QtumLedger::beginSignBlockHeader(const std::string &fingerprint, const std::string &header, const std::string &path, std::vector &) { // Execute command line std::vector arguments = d->arguments; - arguments << "-f" << fingerprint << "signheader" << header; + arguments << "-f" << fingerprint << "signheader" << header << path; d->process.start(d->toolPath, arguments); d->fStarted = true; return d->fStarted; } -bool QtumLedger::endSignBlockHeader(const std::string &, const std::string &, std::vector &vchSig) +bool QtumLedger::endSignBlockHeader(const std::string &, const std::string &, const std::string &, std::vector &vchSig) { // Decode command line results UniValue jsonDocument = json_read_doc(d->strStdout); diff --git a/src/qtum/qtumledger.h b/src/qtum/qtumledger.h index b6dff483b8..e66a3992d3 100644 --- a/src/qtum/qtumledger.h +++ b/src/qtum/qtumledger.h @@ -34,10 +34,11 @@ class QtumLedger { * @brief signBlockHeader Sign block header * @param fingerprint Fingerprint of the ledger * @param header Block header for the new block + * @param path HD key path * @param vchSig Signature * @return true/false */ - bool signBlockHeader(const std::string& fingerprint, const std::string& header, std::vector& vchSig); + bool signBlockHeader(const std::string& fingerprint, const std::string& header, const std::string& path, std::vector& vchSig); private: bool toolExists(); @@ -47,8 +48,8 @@ class QtumLedger { bool beginSignTx(const std::string& fingerprint, std::string& psbt); bool endSignTx(const std::string& fingerprint, std::string& psbt); - bool beginSignBlockHeader(const std::string& fingerprint, const std::string& header, std::vector& vchSig); - bool endSignBlockHeader(const std::string& fingerprint, const std::string& header, std::vector& vchSig); + bool beginSignBlockHeader(const std::string& fingerprint, const std::string& header, const std::string& path, std::vector& vchSig); + bool endSignBlockHeader(const std::string& fingerprint, const std::string& header, const std::string& path, std::vector& vchSig); private: QtumLedger(const QtumLedger&); diff --git a/src/validation.cpp b/src/validation.cpp index f2fc98bb2d..b1ab4fd32f 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -4778,6 +4778,14 @@ bool SignBlockHWI(std::shared_ptr pblock, CWallet& wallet, std::vector pblock, CWallet& wallet, std::vectorGetWithoutSign(); - if(!device.signBlockHeader(wallet.m_ledger_id, header, vchSig)) { + if(!device.signBlockHeader(wallet.m_ledger_id, header, strStaker, vchSig)) { return false; } From 8a10a53861a7354f266b7abb74104627e7c31a79 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 12 Apr 2021 11:36:14 +0200 Subject: [PATCH 104/164] Add install and remove for Qtum Stake application --- src/Makefile.qt.include | 5 +- src/qt/bitcoin.qrc | 3 + src/qt/forms/qtumledgerinstallerdialog.ui | 42 +- src/qt/qtumhwitool.cpp | 7 +- src/qt/qtumhwitool.h | 5 +- src/qt/qtumledgerinstallerdialog.cpp | 32 +- src/qt/qtumledgerinstallerdialog.h | 1 + src/qt/res/ledger/nanos_stake_app.hex | 2515 +++++++++++++++++++++ src/qt/res/ledger/nanos_stake_delete.txt | 1 + src/qt/res/ledger/nanos_stake_load.txt | 1 + 10 files changed, 2586 insertions(+), 26 deletions(-) create mode 100644 src/qt/res/ledger/nanos_stake_app.hex create mode 100644 src/qt/res/ledger/nanos_stake_delete.txt create mode 100644 src/qt/res/ledger/nanos_stake_load.txt diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index 0d81dadf7b..25e2f7343e 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -645,7 +645,10 @@ qt/res/styles/theme3/app-icons/bg.png RES_LEDGER = qt/res/ledger/nanos_app.hex \ qt/res/ledger/nanos_load.txt \ -qt/res/ledger/nanos_delete.txt +qt/res/ledger/nanos_delete.txt \ +qt/res/ledger/nanos_stake_app.hex \ +qt/res/ledger/nanos_stake_load.txt \ +qt/res/ledger/nanos_stake_delete.txt BITCOIN_RC = qt/res/bitcoin-qt-res.rc diff --git a/src/qt/bitcoin.qrc b/src/qt/bitcoin.qrc index 0a7c3aa909..3d5e5e162b 100644 --- a/src/qt/bitcoin.qrc +++ b/src/qt/bitcoin.qrc @@ -244,5 +244,8 @@ res/ledger/nanos_app.hex res/ledger/nanos_load.txt res/ledger/nanos_delete.txt + res/ledger/nanos_stake_app.hex + res/ledger/nanos_stake_load.txt + res/ledger/nanos_stake_delete.txt diff --git a/src/qt/forms/qtumledgerinstallerdialog.ui b/src/qt/forms/qtumledgerinstallerdialog.ui index 4bcb77143a..18d953d4cb 100644 --- a/src/qt/forms/qtumledgerinstallerdialog.ui +++ b/src/qt/forms/qtumledgerinstallerdialog.ui @@ -35,7 +35,7 @@ 30 - + 75 @@ -61,30 +61,40 @@ - Select ledger type: + Select ledger application: - + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + true + + + - - - - Qt::Vertical - - - - 20 - 40 - - - - diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 7f98212446..6c06e3c6e8 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -570,7 +570,7 @@ class InstallDevicePriv } } - InstallDevice::DeviceType type = InstallDevice::NanoS; + InstallDevice::DeviceType type = InstallDevice::WalletNanoS; QStringList filePaths; }; @@ -588,8 +588,10 @@ InstallDevice::~InstallDevice() QString InstallDevice::deviceToString(InstallDevice::DeviceType type) { switch (type) { - case InstallDevice::NanoS: + case InstallDevice::WalletNanoS: return "nanos"; + case InstallDevice::StakeNanoS: + return "nanos_stake"; default: break; } @@ -642,6 +644,7 @@ bool InstallDevice::getRCCommand(const QString &rcPath, QString &program, QStrin QString InstallDevice::parse(QString arg) { + arg = arg.replace(" ", " "); arg = arg.remove("\""); if(arg.startsWith(RC_PATH_FORMAT)) { diff --git a/src/qt/qtumhwitool.h b/src/qt/qtumhwitool.h index 817ef1d7a8..c8afc557e8 100644 --- a/src/qt/qtumhwitool.h +++ b/src/qt/qtumhwitool.h @@ -60,13 +60,14 @@ class InstallDevice */ enum DeviceType { - NanoS + WalletNanoS, + StakeNanoS }; /** * @brief InstallDevice Constructor */ - InstallDevice(InstallDevice::DeviceType type = InstallDevice::NanoS); + InstallDevice(InstallDevice::DeviceType type = InstallDevice::WalletNanoS); /** * @brief ~InstallDevice Destructor diff --git a/src/qt/qtumledgerinstallerdialog.cpp b/src/qt/qtumledgerinstallerdialog.cpp index 10b3d0e644..b1450950e9 100644 --- a/src/qt/qtumledgerinstallerdialog.cpp +++ b/src/qt/qtumledgerinstallerdialog.cpp @@ -24,7 +24,10 @@ QtumLedgerInstallerDialog::QtumLedgerInstallerDialog(QWidget *parent) : ui->setupUi(this); d = new QtumLedgerInstallerDialogPriv(this); - ui->cbLedgerType->addItem(tr("Ledger Nano S"), InstallDevice::NanoS); + ui->cbLedgerApp->addItem(tr("Qtum Wallet Nano S"), InstallDevice::WalletNanoS); + ui->cbLedgerApp->addItem(tr("Qtum Stake Nano S"), InstallDevice::StakeNanoS); + + ui->labelApp->setStyleSheet("QLabel { color: red; }"); } QtumLedgerInstallerDialog::~QtumLedgerInstallerDialog() @@ -80,15 +83,17 @@ void QtumLedgerInstallerDialog::on_cancelButton_clicked() InstallDevice::DeviceType QtumLedgerInstallerDialog::getDeviceType() { - int deviceType = ui->cbLedgerType->currentData().toInt(); + int deviceType = ui->cbLedgerApp->currentData().toInt(); switch (deviceType) { - case InstallDevice::NanoS: - return InstallDevice::NanoS; + case InstallDevice::WalletNanoS: + return InstallDevice::WalletNanoS; + case InstallDevice::StakeNanoS: + return InstallDevice::StakeNanoS; default: break; } - return InstallDevice::NanoS; + return InstallDevice::WalletNanoS; } bool QtumLedgerInstallerDialog::parseErrorMessage(QString &message) @@ -118,3 +123,20 @@ bool QtumLedgerInstallerDialog::parseErrorMessage(QString &message) message = d->tool->errorMessage(); return true; } + +void QtumLedgerInstallerDialog::on_cbLedgerApp_currentIndexChanged(int index) +{ + int deviceType = index; + switch (deviceType) { + case InstallDevice::WalletNanoS: + return ui->labelApp->setText(""); + case InstallDevice::StakeNanoS: + return ui->labelApp->setText(tr("When Qtum Stake is installed, please turn off the auto lock:\n" + "Nano S > Settings > Security > Auto-lock > OFF\n" + "\n" + "When Qtum Stake is removed, please turn on the auto lock:\n" + "Nano S > Settings > Security > Auto-lock > 10 minutes\n")); + default: + break; + } +} diff --git a/src/qt/qtumledgerinstallerdialog.h b/src/qt/qtumledgerinstallerdialog.h index 259cd5637f..2c65a8ae52 100644 --- a/src/qt/qtumledgerinstallerdialog.h +++ b/src/qt/qtumledgerinstallerdialog.h @@ -22,6 +22,7 @@ private Q_SLOTS: void on_addButton_clicked(); void on_removeButton_clicked(); void on_cancelButton_clicked(); + void on_cbLedgerApp_currentIndexChanged(int index); protected: InstallDevice::DeviceType getDeviceType(); diff --git a/src/qt/res/ledger/nanos_stake_app.hex b/src/qt/res/ledger/nanos_stake_app.hex new file mode 100644 index 0000000000..5271731c11 --- /dev/null +++ b/src/qt/res/ledger/nanos_stake_app.hex @@ -0,0 +1,2515 @@ +:02000004C0D06A +:1000000010B5044662B604F04BFD002C0DD0012063 +:1000100000022168814205D1606801280AD1A068E8 +:10002000002803D104F00CFC02E0002004F02CFCBA +:10003000002010BD204604F0A9FCF0B581B00446B4 +:100040000020002A1CD00B780A2B19D89D0001260D +:100050003543954214D82370002B10D00096271DED +:100060004D1C002601210022284602F003FA01C798 +:100070002D1D761C20788642F4D3009800E030468F +:1000800001B0F0BDF0B58DB04A484B4C0027275267 +:100090004120C0000090275401AE304608F00CFD0E +:1000A0000546B585A8B2002812D0102877D001A83F +:1000B00087850B9805F0ECFE02203E4960524048CF +:1000C0006F21017045700121204602F049FD58E082 +:1000D00001A805F0DDFE0B90208802F048FD207895 +:1000E000002802D03548334D2FE0354A5078137838 +:1000F0000021364D7D44364E7E446F5CBB4202D1BA +:10010000775CB8420AD0491C0D29F6D36D20000255 +:10011000CBB20D210D2B274D01D116E0254D2D48D9 +:100120007844405C002809D08120830067200002C9 +:100130001279002A09D0E25A052A06D088002649F9 +:100140007944085805F0EAFB80471E496052252192 +:100150004901615C00290CD0009BE15CEF220A4060 +:10016000E25409210903884203D05D21164A012384 +:100170005354615B020A124B5A545A185070881C2F +:10018000605305F079FE01A9884202D10B9805F071 +:100190007FFE01A8808D002809D10DB0F0BD01A817 +:1001A00087850B9805F074FE102004F0B3FC04F072 +:1001B000B1FCC046060200007C180020AA6F0000B7 +:1001C000E81F00200A02000000180020068C000032 +:1001D0000F8C0000F48B0000E48B0000F0B581B0C0 +:1001E00018480024FF22214604F075FC41200090AD +:1001F000C600154FBC5515483C525D241448015D9E +:10020000B85D252255017A5D002A06D0002904D068 +:10021000202108430099C90078540C49795A04F008 +:10022000C3FE812189007852785D002806D00848F5 +:10023000005D002802D0002005F0EAFDFFF722FF54 +:10024000DBE7C046E81F00207C1800200602000003 +:1002500000180020F0B581B0304C7C44204605F0F9 +:100260005DFB808802F083FC204605F057FB808808 +:10027000C0B2254CFF2843D02948784405F04EFBF6 +:100280008088FF2108423BD0204804680546A088AA +:100290001F4F7870000A3870E088F870000AB87054 +:1002A000207A38710934204608F028FC02467A7119 +:1002B000B81D214604F0F9FB2C682046093008F0EF +:1002C0001DFC0546AE1D2734204608F017FCF1B290 +:1002D0007854EE1DF0B23D18204608F00FFC02469F +:1002E0002846214604F0E1FB08480068273008F062 +:1002F00005FC8019C0B20749074A5052092004037F +:10030000204601B0F0BDC04685690000201D0020D8 +:10031000E81F0020060200007C180020629A0000FE +:10032000429A000010B51148784405F0F7FA807938 +:100330000B490C4A082353520B4930224A700122C0 +:100340008A700523CB7003230B714A7100248C71D2 +:10035000CB7110401B2242400A700920000310BDDF +:10036000060200007C180020E81F0020949900007D +:10037000B0B51A4C7C44204605F0D0FA808802F0D3 +:10038000F6FB204605F0CAFA8088C0B20F4CFF2861 +:1003900019D01348784405F0C1FA8088FF2108423B +:1003A00011D06B2004020A4DA87800280BD10D480B +:1003B000784405F0B3FA80880649074A012353526E +:1003C0002870092004032046B0BDC046856900009E +:1003D000E81F0020060200007C1800204899000059 +:1003E000289900000C99000010B50720C0430A4965 +:1003F0000979002900D00846C4B267200002F82C11 +:1004000008D80548214605F0F7FB044804490C527A +:100410000920000310BDC046E81F002006020000AE +:100420007C180020F0B585B0524E3779564D7D448A +:10043000284605F073FA808802F099FB284605F0FB +:100440006DFA8088C0B24C4C042800D98CE001259C +:10045000294681401620014200D185E00497B178F9 +:100460006B200702002080291ED000297FD1701D3B +:1004700000262946324601F0FDFF6A023F498850B6 +:100480007F2080000E5428020D543D20C0000E54E1 +:100490003B480E547B2080000E541F2000010E505C +:1004A0000E75CE77334E0420F178002935465ED1A3 +:1004B0000499091A7D229200304FB9542818401D22 +:1004C0003F21C90078500126304602F015FC092072 +:1004D0000203387D082849D100233B757F20800026 +:1004E0003946385CFB340028274640D02024684633 +:1004F0001F462B463033029318C008462830314639 +:1005000004923A463B4605F085FB082103912846B4 +:1005100005F072FB322028706F702A1D029F38464A +:100520002146234605F0A2FB7002144E315828469E +:10053000243002F032F92846283031461531039A2A +:1005400004F0B3FA1148784405F0E8F969460F6001 +:100550004C600830302321462A4605F097FB0948B5 +:1005600038213152049F02E0274600E01746B8B216 +:1005700005B0F0BDE81F0020856900007C18002050 +:100580008E040000060200008E980000769700009E +:10059000F0B59FB014460E4602AD69460D600121CC +:1005A00015AF1A463B4602F078F908354127002E70 +:1005B00003D1284601F01EFD21274122204629466D +:1005C00004F073FA38461FB0F0BD0000F0B59DB0DE +:1005D000C44E7E44304605F0A1F98579BB4CA07825 +:1005E0000D90304605F09AF92927C05D0126354067 +:1005F0000B95002500282A460AD0A07802282A4612 +:1006000006D1B348817901220020072900D0024693 +:100610000C92B548784405F081F9C05D0D9B012B23 +:1006200029460DD00C990029294609D100282946D0 +:1006300006D0A74881790020072900D00646314618 +:100640000A910127012B384600D12846252149016E +:10065000A04A515CA04EFE36E278002903D0002863 +:1006600001D135462FE16B200502A078022800D980 +:1006700029E1022A11D3032A08D0022A00D022E15C +:1006800096480068406B002807D11CE19348006839 +:100690004021405C022800D015E167200502207946 +:1006A000002800D10FE1012B099202D1601D04F056 +:1006B00069F808900C98002809D060798000801DA6 +:1006C000C0B220180121002201F0D4FE1C90874DF9 +:1006D0007D44284605F022F9808802F048FA284631 +:1006E00005F01CF97C49CD1C8088C0B2042800D9D3 +:1006F000E9E0012181401620014200D1E3E005F04C +:100700004BFBAA28744D00D0DDE0651D2846394614 +:1007100002F05CF90790412006902070671C14AB32 +:1007200028460B993A46FFF733FF099B0546012BF4 +:1007300014D0032B10D1E9B20EAD38462A4602F090 +:1007400034F80020694608602246433214213223DF +:10075000284602F0F7FF43E0022B34D10EA8142103 +:1007600004914170002105910170E9B2821C384664 +:100770001F46039202F019F858480068022F17D15B +:10078000049F406B00282CD005F0C8F8014668464D +:1007900007602746433700223846039B05F086F959 +:1007A0000546E8B201281CD1384608F0A7F917E041 +:1007B000C0886946086005984860224643320EA802 +:1007C000162196230AE045480068808800216A4681 +:1007D00003C2E9B2224643329623384602F014F8A7 +:1007E0000546422025540B98002801D10420607052 +:1007F000EFB2E5192846433014A9202204F055F938 +:10080000384663303649334B58520D98012830D062 +:10081000079800282DD00C98002847D02425585D33 +:10082000002808D0194620311CA8042204F05CF9E5 +:10083000284B00283AD000265E55184620301CA9C7 +:1008400004221F4604F031F91C9B2046C8300925BC +:10085000274A7A44294604F08DFED0202654069873 +:10086000C000395C10220A433A5403F0ABFF2D0359 +:1008700029E00D95322F354625D82046C83043341F +:1008800021463A461C4604F010F9C82000210D9A72 +:1008900011540698C000215C10220A432254089883 +:1008A000C0B203F07DFF092005030CE00920050319 +:1008B0000A98002807D00698C000195C10220A4345 +:1008C0001A5403F089FFA8B21DB0F0BDE81F002044 +:1008D0003C2100207C18002082690000201D00209F +:1008E00006020000EA960000A8960000EC950000C1 +:1008F000F6830000B0B5692300218522002807D0C7 +:100900000C480D49085A0D4941180B32002001E0EE +:1009100010461A468BB20A4CE2548A1C054B064D0F +:10092000EA52491C89B2605491B2202004F03CFB89 +:10093000B0BDC046060200007C180020FEFF00008B +:10094000E81F0020F0B593B00920C701C24D002672 +:10095000EE51C24C285D02281FD0012800D078E15A +:10096000C84FEE51BE48295A002900D155E1BF4871 +:10097000285C0122FD2846D3FE283AD0FD2800D06D +:1009800067E1032900D248E1BF48295CA12080002B +:10099000285C00020843032235E0B14C295B092999 +:1009A00000D23AE1AF4BE85CFD22FC2801D80922D5 +:1009B0000EE0904200D04CE10B2900D22DE1AA4874 +:1009C000281800210A4601F031FDA64B295B0B22B5 +:1009D0001018884200D920E10A9000200126A3497E +:1009E0002A18525C401C002A21D100240728F7D97C +:1009F0002BE0052900D210E1A348281800210A465F +:100A000001F038FD0522E851022129558F21C90046 +:100A10006850964828188118914C16462A5B921BFC +:100A200004F043F8285B801B28530126F5E0691881 +:100A300011AC0822204601F026FF8D4828180146F7 +:100A4000224602F09DF8874B34460497EF1838464B +:100A500001F0FAFD0590384601F0C4FB07903846D6 +:100A600001F0F8FB02908348006840210391405C4C +:100A7000002111280891099108460FD17B2081009F +:100A80000691384601F002FE09903846069901F0B9 +:100A900035FE08903846069901F035FE019038463B +:100AA00001F0FAFB1F2211010691695802290ED8A4 +:100AB00000920390384601F047FB0799084300284D +:100AC0000A9A3AD006982858012852D8C1E06948B5 +:100AD00000680399405C11280A9A07993B4614D193 +:100AE00018461F4601F030FB3B4607990A9A084317 +:100AF00000280AD10898099B1843002C01D1059BB6 +:100B0000184300283B4600D1A3E05A480068039FE1 +:100B1000C05D11282DD001200021059A002A00D0A7 +:100B200008460443184601F00FFB07990843012CBF +:100B30000A9A1ED100281CD18BE00898099B184303 +:100B4000002C06D00028BDD106982858002807D1CF +:100B50007FE0059B18430028B4D100980001285875 +:100B6000039B002B01D1012873D0002B01D1022857 +:100B70006FD00998089B0343002B6AD10598002881 +:100B8000049F3FD13C48285C00283BD0029B0B438C +:100B900004240320002B00D00446019808430028B9 +:100BA0000CD136482918E0B228182E4A8018142291 +:100BB00003F09AFF07990A9A002838D03D20C00018 +:100BC00000291FD0285C00281CD009940BAC1422EB +:100BD000089262700020207028482918A01C03F099 +:100BE00064FF16212046224601F0DFFD0998C0B2BD +:100BF00028181C4940182146089A03F075FF002860 +:100C00000ED00A9A06996858401C6850EA51412053 +:100C1000C000295C10220A432A54304613B0F0BDAC +:100C2000144800684421405C400712D50A9A1448D1 +:100C3000295C00290DD10121295406996858401CCE +:100C400068508F20C0002958491E2950002AE4D03E +:100C5000DFE6012003F05EFF7C1800208404000022 +:100C6000760400008A0200008B020000820200006D +:100C700085040000201D00207E0200006A020000A2 +:100C80008D0400007C0400008302000070B59EB05B +:100C90000C4601AD69460D600126002214AB3146B9 +:100CA00001F0FBFD0948784404F038FE08358179ED +:100CB0004120314203D1284601F09CF9212081B224 +:100CC0002846224601F071FD1EB070BD169000004E +:100CD000F0B59FB0DE4A94786B210E021179002C9A +:100CE00004D0FF2C02D0802C00D098E10A90D94B80 +:100CF000D94F3D20C0000990385C0025002806919E +:100D000012D0F85C00280FD150790125FD21FD2873 +:100D10000AD34A1CD5B205220023A84200D01A46A5 +:100D20000325884200D015460BAE304607F0C4FEBE +:100D3000B085CA49084208D00BA8002181851598C2 +:100D400005F0A6F86F20060246E10BA805F0A0F812 +:100D50001590387DC24E092800D03AE10221C843DF +:100D6000801CC0B2844240D1787F002800D11CE1B1 +:100D70000520C401385D002800D12AE10025582251 +:100D80000A98294603F0A7FEB1494879002800D106 +:100D90000BE10A9E2336491D2922304603F085FEC9 +:100DA000B64839183046FFF771FF3D55B04801216C +:100DB000395434463046AA4D01F0B6FD002800D122 +:100DC000F3E025204001385C00282E4600D000E1E9 +:100DD000A648042139544120C000395C10220A433E +:100DE0003A54204603F002FDDFE00791F520400071 +:100DF0000890385C002813D1E8B206990B1A3446E3 +:100E0000FB36002B00DAE4E000216A4611605160F5 +:100E10008F4A1018421D3846283004F0FBFE264643 +:100E2000787F00282FD08F4C385B069D4119FB3608 +:100E30007D229200914200D9CBE038188A494018AF +:100E40008349491D2A4603F030FE385B4019385368 +:100E5000FFF778FD002804D04120C000385CC006B0 +:100E6000F6D58F20C000385800287D4E0BD1412088 +:100E7000C100795C1022114205D17C4B0324FC5443 +:100E80001143C00039540998385C714A917800299F +:100E900024D0002811D120206946486017A8086096 +:100EA000384694306A494A1D0121069B04F0B2FE7F +:100EB00067490998385C002850D00898385C0028A9 +:100EC00022D020206946486017A80860172000013A +:100ED0003A1838469430012160233CE000280BD1B9 +:100EE000002168460160416038469430584A521DDE +:100EF000069B04F08FFE564A5F480121395255483F +:100F000039540020107050E0202468461B2109014C +:100F1000791801600A46039244603D462835012154 +:100F2000049100230593284604F074FE284604F03B +:100F300091FE6846039A14C02846049D294623461C +:100F400004F068FE6846446017A901603846943092 +:100F50003F4A2946059B04F05DFE3D49787F002805 +:100F600029D04348385C002804D1002158220A982F +:100F700003F0B1FD3F48006801790A9C61708079F7 +:100F8000A07020464C30082104F036FE3A480799FC +:100F9000395200202E4908704870787F002811D0FF +:100FA000E01C17A9202203F080FD159804F070FFC3 +:100FB0000920060333E03048079A3A52002048706F +:100FC00008700A9CE11C17A8202201F0D7FB00281A +:100FD00028D0159804F05CFF274C00203853387552 +:100FE000204D7A5B20483918194803F05EFD785B84 +:100FF000385304F041FF0BA9884202D1159804F040 +:1010000047FF1A4801213954164800243C521C4815 +:1010100038180822214603F05EFD1A483C54B0B24D +:101020001FB0F0BD0898385C7B218900795C0143D2 +:1010300009983A5C0A20002A05D0090603D101204C +:10104000089978540020387509200603D1E7C04676 +:10105000E81F0020810200007C180020FFFF000034 +:10106000856900007604000082020000840400000C +:101070007E020000201D0020060200006A0200001F +:10108000850400008D04000070B521200001134D7F +:101090002818FFF71DFE04464120C600A85DC006C3 +:1010A00019D50F48295C042904D0032905D103F080 +:1010B00029FB04E0012129540DE003F0FDFA00288A +:1010C00009D1084800212952A85DEF220240AA5503 +:1010D0002975D520C401204670BDC0467C1800206B +:1010E0008404000006020000F0B581B08F20C70024 +:1010F0003D4DE8593D4C295D022901D1401EE85182 +:1011000009210E030028009629D039482818CE015D +:10111000AA598118374C2B5B9A1A03F0C6FCA859C0 +:10112000295B081A28534120C600A85DEF21014021 +:10113000A955FFF707FC002802D0A85DC006F8D526 +:10114000A85DC006009E294C09D503F0B5FA0146FA +:101150000120002945D100202875D520C601295D30 +:1011600002290AD1E859002807D10320285503F0A5 +:10117000C9FA002807D0295D0AE0320A0020009B46 +:101180009E420CD12DE0002129552975D520C6019C +:1011900001200022009B9E4200D01046320A164FCA +:1011A000EB5B164CE2549A1CEA535B1C9BB2E65470 +:1011B000002801D003290FD101200C4968540D48A3 +:1011C00000242C520E4828180822214603F083FCE4 +:1011D0000C482C5408482A5A91B2202003F0E4FE0F +:1011E000002001B0F0BDC0467C180020840400003F +:1011F000820200007604000006020000E81F0020C2 +:10120000850400008D040000F0B585B0744D2F7981 +:101210007C4C7C44204604F081FB808801F0A7FCD4 +:10122000204604F07BFB6F4EF21C8088C0B204287D +:1012300000D9D2E0049701273946814016200142A7 +:1012400000D1CAE0A878684A7632802808D0002801 +:1012500000D0C2E03902654B03245C5400211975AB +:10126000EC788023052C59D8012C57D0002874D154 +:10127000581CC1B200208C4200D00746A01E02902C +:101280005A48407F002803930CD118462A30C0B238 +:101290000090019104F080FD0199009A904232463D +:1012A00000D09AE07B208000504A13461F541F2034 +:1012B000000100221A5001208C4201461E4600D037 +:1012C0001146029BDBB2042B034600D3134619439D +:1012D0003D23DB00F1547077F283454909684023D0 +:1012E000CB5C444972540326744002265E40264378 +:1012F000002E00D01046FF263246EA323B49885481 +:101300001A2B14D8012098403B4A10420FD0E8789D +:10131000052808D004280AD1012005E0802C1CD023 +:10132000812CA3D059E00220324A304988543348F6 +:1013300000242E4F3C54F52040003C5430483818CF +:101340001822214603F0C7FBEC36BC550520C0012E +:1013500001213954EC78A878039B049FFF21EC31DC +:10136000224E3D22D2009C422BD0B25C002A28D0D3 +:10137000725C002A25D1984223D128790A38C0B25C +:1013800031281ED8687902281BD8012808D1A879ED +:10139000382805D1E879322802D1287A002810D0DF +:1013A00025204001305C00280F4A16D101207054DE +:1013B0004120C000315C10220A43325403F036FA57 +:1013C000049F7D20800037543F20C000691D3150AC +:1013D000022001F091FC0920020390B205B0F0BD9B +:1013E000E81F0020826900008A6A00007C18002043 +:1013F000201D00208E040000800140048F040000A6 +:101400006A020000AA8A0000F0B593B0724C7C44D6 +:10141000204604F083FA808801F0A9FB204604F0FE +:101420007DFA8088C0B2634F04283ED80125294642 +:1014300081401620014238D05F4E6B200002B17807 +:10144000002902D0F178002930D1672000023179DB +:1014500007292BD305AC204607F02EFBA085574962 +:10146000084208D005A8002181850F9804F010FDDE +:101470006F2007020EE005A804F00AFD0F90504906 +:10148000087D0A2803D1FB3770790B2811D30F98F8 +:1014900004F0FEFC4A480021017504F0EDFC05A9AA +:1014A000884202D10F9804F0F3FC384680B213B0A2 +:1014B000F0BD44480818741D29220490214603F009 +:1014C000F4FA707980002843215C20184418601CCD +:1014D00000262946324600F0CDFF039064793A4851 +:1014E00037490C543D48784404F018FA80790421B7 +:1014F00008420DD1354800684021415C022902D0E4 +:10150000816B002951D0412CC1D1806B0002044372 +:101510002F482B49085C00281DD111AD284603999E +:1015200001F03BF9281D214601F037F97B208000AE +:101530002349085C002804D011A8082100F0E2FD2E +:1015400009E06846066046600846283011AA08236C +:10155000314604F05FFB0021049D284601F036FA75 +:10156000002805D00120014600F03AF8144C09E0AB +:101570004120C000124C215C10220A43225428460C +:1015800003F044F925204001205C09210F030028C5 +:1015900083D010488168491C81604268914200DA1A +:1015A0007BE75D210122425477E7012C2C46AFD026 +:1015B0006DE7C04685690000E81F0020FFFF0000BE +:1015C0007C1800203302000066020000201D00206D +:1015D0008E04000000180020AE880000D6870000AE +:1015E000F0B5B1B0002818D0039100216846016021 +:1015F0003448354C201827AB0A4601F04EF97B20C1 +:101600008000205C00280FD02020694648601FAA77 +:101610000A604120800020180DE02D4B2A4A00204E +:10162000D052692285263BE02020694648601FAAE7 +:101630000A60204628300121002304F0EBFA04AFB1 +:10164000384604F007FB2025684645601FAE06605B +:1016500001243846214632462B4604F0DBFA1E4868 +:10166000784404F05BF98079400820406946FF2205 +:1016700052320A60486027A8144C31462A46234655 +:1016800001F042FA6178C81C114A0F4B9852114A76 +:101690009A5C61188A707A21CA430B32002603993A +:1016A00000290DD183B2094CE254821C084B064D2F +:1016B000EA52401C80B2265491B2202003F074FC00 +:1016C00031B0F0BD330200007C180020E81F00207C +:1016D00006020000660200005C860000F0B581B0E2 +:1016E00067200602284D287901282AD1284C7C44FD +:1016F000204604F013F9808801F039FA204604F0FE +:101700000DF98088C0B2214FFF2819D021487844B4 +:1017100004F004F98088FF21084211D0FE1E04F075 +:101720003BFBAA280DD16C791B48784404F0F6F8ED +:10173000092109038088C0B2844205D10E4600E029 +:101740003E46B0B201B0F0BD3E46FB36082CF8D89C +:1017500000910120A0408B2149000842F1D00F4D9B +:101760007D44284604F0DAF8408801F000FA284663 +:1017700004F0D4F8408820423E46E2D0204600F0F3 +:1017800041FC009EDDE7C046E81F0020856900009F +:10179000CE850000AE850000928500005C850000CB +:1017A0006D20000270470000F0B58BB009AD00213C +:1017B00006262846324603F08EF90A200A9901438C +:1017C000297101242846214601F0CAF90220284344 +:1017D000214601F0C5F9124F7F44384604F09EF8C7 +:1017E000801C2946324604F0F9F96D462026284629 +:1017F000314604F001FA384604F090F808302946E2 +:10180000324604F0EBF908AD2C70384604F086F847 +:10181000401C2946224604F0E1F90BB0F0BDC04659 +:10182000E4840000F0B581B0017800250091002922 +:1018300018D0441C002701250026204629463246A0 +:1018400000F018FE80B2094988420BD0084988424E +:1018500007D0241D7F1CF8B2009988423546EAD390 +:1018600000E00225E8B201B0F0BDC0461DB10000A5 +:101870001EB10000F0B597B08E4FBC788020204399 +:101880006B210E0280286BD138790990FD78002CED +:1018900003D1022D01D3802D62D1D520C6010A9635 +:1018A000FE3E04F079FAAA285AD10BAE304607F072 +:1018B00003F9B0858049084208D00BA80021818532 +:1018C000159804F0E5FA6F20040238E00BA804F044 +:1018D000DFFA1590002C14D099218900774C615AB9 +:1018E0004D22D200002927D0A25A8A4224D174481E +:1018F0002018FFF797FF002835D000F0EBF80446DA +:1019000025E0012D0DD8212000016C4E3018002457 +:101910005822214603F0DFF878790B282FD3159849 +:101920000AE099218C00654D295B4D22D600AA5B07 +:10193000099BD2188A423ED904F0AAFA0A9C2120B7 +:1019400000015E4908180021582203F0C4F804F091 +:1019500093FA0BA9884202D1159804F099FA264609 +:10196000B0B217B0F0BD4120C000215C10220A4384 +:101970002254159804F08CFA09200603F0E7524827 +:1019800000680179514AB1548079514970544C48EA +:101990003018791D292203F088F878798100012315 +:1019A00019437A185079002D08932FD092790002AC +:1019B000104307222BE0039400246846046044602F +:1019C000284628307A1D029221461D4604F022F94D +:1019D000684604604460394894302146029A2B4698 +:1019E00004F018F93548805B4019344A90533C7034 +:1019F0000399515A80B2814204D1324802211152D6 +:101A00007C7054E02F480121115250E006229923A6 +:101A10009B00F0528918F62807D0B42805D000287A +:101A20000A9C159804F034FA89E74D20C5007453D8 +:101A3000283630460793059104F00CF91F4894307E +:101A4000049004F007F9059A079B06951B48405B34 +:101A50000999491D891ACDB228181849C95A8842CE +:101A600000D95CE7684604604460BA1830462146F5 +:101A700016462B4604F0CEF868460460446004988D +:101A8000214632462B4604F0C5F80C48024606991A +:101A9000505A281850523C700799515A80B28142CE +:101AA0001146089A01D17C70022206480A52092088 +:101AB00004034CE7E81F0020FFFF00007C18002013 +:101AC0003302000006020000201D00201102000069 +:101AD00012020000F0B5A1B03748384F00243C5244 +:101AE00003AD284606F0E8FFA8853549084207D02F +:101AF00003A884850D9804F0CBF96F20040242E01E +:101B000003A804F0C5F90D902021029168464160B8 +:101B100019AE0660294F2837012538462946324636 +:101B2000234604F077F8384604F094F868460660D7 +:101B3000029B436038462946324604F06BF86846FB +:101B4000046020481D4908180FAF214622463B4635 +:101B500000F0A3FE1D48784403F0E0FE80794008C1 +:101B60002840694664220A604860174C3846134F83 +:101B70003146029A234600F0C7FF6078801C0E4968 +:101B800078520920040304F077F903A9884202D1AE +:101B90000D9804F07DF92120000138180021582209 +:101BA00002F099FF03A8808D002802D1204621B0C1 +:101BB000F0BD02F0AFFFC046060200007C18002016 +:101BC000FFFF000033020000E81F002066810000D4 +:101BD00070B525204001094D285C002801D0084C33 +:101BE00009E04120C600FFF745FE0446A85DC00697 +:101BF00001D502F0BFFD204670BDC0467C18002014 +:101C000082690000B0B5014669228520002902D012 +:101C1000FFF760FF020A0749074B5C5A074D2A5538 +:101C2000A21C5A52611C89B2685491B2202003F060 +:101C3000BBF9B0BD060200007C180020E81F0020A0 +:101C40006D20000270470000F0B589B01E461746AF +:101C50000A460024E543782A00D987E0002A06D006 +:101C60000024015D002902D1641C9442F9D3049040 +:101C7000111B8A2048436421069206F06BFC034640 +:101C80005A1C306898423FD9019602950021384687 +:101C90000092059302F01FFF059B0394069884426F +:101CA00026D21946039A04980792805C491E08912F +:101CB0001C46395D09020E183D463A273046394622 +:101CC00006F0D2FC4743F11B2F46395539360899A7 +:101CD0008C4201D8732E04D3611E002C0C46E8DC24 +:101CE00000E02146079A521C06988242059BDAD1F1 +:101CF0000021039A029D019E785C002806D1481CB1 +:101D000099420146F8D302E032602FE0084600997C +:101D10008918091A336831608B4227D3131A002BB4 +:101D200010DB481E0028059B19DB134878447C18FB +:101D30001E46BB5DC35C635533465B1E491E0029CE +:101D4000F5DC0CE08A420AD20A49794414463B5C2D +:101D5000CB5C3B55401C641C33689C42F7D307485E +:101D600078440178384602F0B6FE0025284609B0CE +:101D7000F0BDC046766F0000946F0000606F0000F9 +:101D8000F0B595B000920F4602900AAC2A21204689 +:101D900006F056FD022004430594790001400D220F +:101DA0000A4303924140881D0190132500210298A7 +:101DB0000491405C0690002107200991401A0121FE +:101DC00008918140069801400791ECB2142C0ED87E +:101DD0001520021B60000AA90E183188C81C0429AE +:101DE00000D808463080521EB61C002AF5D160008B +:101DF0000AA9085AFF34072800D82C46E0B2132855 +:101E000017D814210D1A400005990A180AA90E5A6C +:101E1000138801210027072B084600D83846760092 +:101E20000E2737400743C8431752921C6D1E1E46AB +:101E3000EED107980028089A00D102461498400075 +:101E40000E21014011430AA801850999491C08295E +:101E50002546B1D10499491C08292546A7D100215E +:101E60000B460A460C46009ED8B240000AAD285ADE +:101E7000240603D1002801D10C4604E0D4B230304E +:101E80003055521C01245B1CD8B2039D8542EBD80F +:101E90001106019D02D1302131700122002421461A +:101EA000CEB2B5420D4622D9361876000AAFBE5BD7 +:101EB0006D1C002E04D1EEB2019FB742F4D816E09B +:101EC0002506009F04D1D4B22E253D55521C012475 +:101ED000DDB26D000AAE755B3035D6B2BD55521C11 +:101EE0005B1C491CCDB2019EAE423546D8D8D0B25B +:101EF00015B0F0BD80B583218900044A52580449C9 +:101F00000968496CFFF73CFF80BDC0467C18002083 +:101F1000201D0020F0B583B02B4D00262B4A28460B +:101F2000314602F0D8FD2846314600F019FE284817 +:101F30002E52252040012E54264801242C54264898 +:101F400028180822314602F0C6FDFF20EC302E543E +:101F500022482E542248784403F0E0FC40780128BF +:101F600001D0FFF721FC1F48784403F0D7FC4078EC +:101F7000002807D01C48784403F0D0FC808800F08B +:101F8000F6FD02E0FF2000F03DF81848784403F029 +:101F9000C5FC0078002814D102AD2C7001AE34705D +:101FA000134F7F44384603F0B9FC293031462246AE +:101FB00003F014FE384603F0B1FC2946224603F034 +:101FC0000DFE03B0F0BDC0467C180020A404000044 +:101FD0007604000084040000850400008D040000E5 +:101FE000667D0000547D0000467D0000307D0000CD +:101FF0001A7D00004021415C01220A400221114368 +:102000000170704710B582B0014601AC204600F067 +:10201000A7FD0548784403F081FC001D02222146FB +:1020200003F0DCFD02B010BDA87C0000F0B58DB05F +:1020300007464120800032490D180C46284603F01F +:1020400009FE002668460660466077208000221858 +:1020500004232846314603F0DDFD684606604660ED +:10206000172000012218202428463146234603F079 +:10207000D1FD6846066046601920000120490A1813 +:1020800028463146234603F0C5FD0C960B96039770 +:1020900008377D2084000CAA0BAB3846214600F09F +:1020A0000DFA002828D00B980C9900266A46166075 +:1020B00056600B18083328463146039A03F0AAFDF0 +:1020C00004AA3846214600F023FB002813D06846B6 +:1020D0000660466004AA1A232846314603F09AFD9A +:1020E000684606604660082328463146039A03F096 +:1020F00091FD012600E0002630460DB0F0BDC0463F +:102100007C180020F0B583B00C46054600266846D2 +:1021100006604660412080000A490F181B2000011C +:102120000A1820233846314603F074FD68460660DD +:102130004660384631462A46234603F06BFD03B01D +:10214000F0BDC0467C18002070B504461E4E3068B5 +:10215000416B002911D01D4979440322204602F029 +:10216000C3FC012500282CD01949794403222046BC +:1021700002F0BAFC002824D030684021405C1328CB +:102180000CD1144979440422204602F0ADFC002809 +:1021900016D118341049794428220BE00F497944AC +:1021A0000422204602F0A0FC002809D118340C4972 +:1021B00079440222204602F097FC0125002800D035 +:1021C0000025284670BDC046201D0020296B000058 +:1021D0001A6B0000036B0000F56A0000AF6A000094 +:1021E000A16A0000B0B50446154800684021405C73 +:1021F000132810D1134979440322204602F074FCBD +:1022000000281AD11734104979442722204602F0B9 +:102210006BFC01250FE00D4979440322204602F0B2 +:1022200063FC002809D11734094979440125204667 +:102230002A4602F059FC002800D000252846B0BDEF +:10224000201D0020616A0000526A00003B6A000005 +:102250002C6A0000B0B504460C480068406B0028AA +:1022600010D00B4979440322204602F03DFC0125A1 +:10227000002808D0074979440322204602F034FCA4 +:10228000002800D000252846B0BDC046201D0020F3 +:102290001D6A00000E6A0000B0B504461B4979446F +:1022A000032202F021FC002809D1204623301849DE +:1022B000794401252A4602F017FC002824D015494C +:1022C00079440322204602F00FFC002809D1204661 +:1022D00023301149794401252A4602F005FC0028E3 +:1022E00012D00E4979440322204602F0FDFB00285B +:1022F00009D143340A497944012520462A4602F08F +:10230000F3FB002800D000252846B0BD156A000068 +:102310000C6A0000F6690000E8690000D569000059 +:10232000C6690000F0B586B0FF2414700468002769 +:102330008C421AD20B9E002B01D000241C60002E70 +:1023400001D00024346005684C1B012C0DDB059284 +:102350002A46551C056014784E2C5FD804954C2CE9 +:10236000039704D22746049D45E03C4659E00027E8 +:102370004E2C26D04D2C0DD04C2CF4D10294374647 +:10238000049C0E1B0024012E3E464ADB951C056072 +:1023900057782FE002940196049C0E1B0024022E15 +:1023A00015463EDB009300231C461F46049AD65C6C +:1023B000E4B2A640F7195B1C0834022BF7D1ED1CE0 +:1023C00015E002940196049C0E1B0024042E154671 +:1023D00027DB0093002423462746049A165DDBB2D0 +:1023E0009E40F719641C0833042CF7D16D1D05605D +:1023F000009B019E029C491B002915DB0495254684 +:10240000B942039C0DD3002B01D004991960002E12 +:102410002C4600D037600168C91901600598047026 +:102420000124204606B0F0BD039CFAE7F0B581B068 +:1024300000920722D34308240029224600D01A46DE +:10244000002900D10C4600252946465D7F273740EC +:10245000002D334600D13B46009F002F00D01E4682 +:10246000E3B29E4071189C186D1C022DEDD10846F8 +:1024700001B0F0BDF0B581B000920722D34308222D +:10248000002900D01A461824002900D10C46002546 +:102490002946465D7F273740002D334600D13B4615 +:1024A000009F002F00D01E46E3B29E4071189C187A +:1024B0006D1C042DEDD1084601B0F0BDF0B5044609 +:1024C00000201060186000291FD02578FD26FC2D03 +:1024D00001D8012710E0032917D3B54215D1601C9C +:1024E000002426462546075DF6B2B7407D19641CD8 +:1024F00008360327022CF6D115601F601068C31937 +:10250000012000228B4200D91046F0BDF0B585B005 +:10251000144602460020FD26002B029608D0002318 +:1025200000291BD01578B54205D201212B4616E0B3 +:102530000B46014613E0032910D3B54219460ED1CC +:10254000561C00252F462B46715DFFB2B940CB18B3 +:102550006D1C08370321022DF6D100E01946029DBB +:10256000AD1C04AE357055180395D2185518002BC4 +:1025700017D0002637466846066003A804AA2946F5 +:102580003346FFF7CFFE00280AD004A80178781C54 +:10259000A14200D038460399A9420746EBD100E09A +:1025A000384605B0F0BDF0B585B002920027FD2297 +:1025B000002B08D0002300291BD00478944205D2B8 +:1025C0000121234616E00B46394613E0032910D3B8 +:1025D000944219460ED1441C00252E462B46615DBF +:1025E000F6B2B140CB186D1C08360321022DF6D18E +:1025F00000E01946921C04AC227042180392C018E5 +:10260000451802980128019716DB002B019F13D073 +:102610000B9C0A9E00276846046003A804AA29466A +:102620003346FFF77FFE002806D07F1C02988742C2 +:1026300002DA0398A842EED1012002998F4200D01D +:10264000019805B0F0BD000070B501464A7801233D +:1026500000246A2A184600D020460B4D2D684026DB +:10266000AD5D022D00D023461843022D0AD16A2AFF +:1026700008D00020002A05D18A78012000216A2A8A +:1026800000D0084670BDC046201D002080B5C12284 +:1026900000F002F880BD0000F0B581B015460E468E +:1026A0000746FFF751FD0024002804D13846FFF704 +:1026B00099FD002802D0204601B0F0BD0E48006808 +:1026C0004021405C7978022807D16A2905D0002989 +:1026D00007D1B8786A28EED003E06A29EBD0022847 +:1026E000E9D00123384631462A46FFF70FFF002480 +:1026F0000128E0D10446DEE7201D002080B5C2227B +:10270000FFF7CAFF80BD80B5C422FFF7C5FF80BDBB +:10271000F0B585B0144600270497039703AA6B46CB +:102720005A6004AA1A60022201263346FFF73BFFD3 +:1027300001283D4600D1054604990029304600D1C4 +:10274000084605400398142800D03E463540002D29 +:1027500011D076206070192020701422E27077204A +:10276000C64330462130A070201D02F09EF9243669 +:10277000667688202076284605B0F0BD70B5002327 +:10278000002A08D00023521E94B2055D0E5D6E40F3 +:102790003343002CF7D1D8B270BD01700A0A4270E1 +:1027A0000A0C8270090EC1707047F0B5A3B01646CE +:1027B00003AC202522462B4603F058FA0BAF3846CF +:1027C00003F03CFA142069460E6048600121384647 +:1027D00022462B4603F01EFA23B0F0BD70B588B038 +:1027E00014466D4620262A46334603F03FFA284613 +:1027F00031462A46334603F039FA04222046294658 +:1028000002F053F908B070BDF0B58BB01D46144608 +:102810000346109E02270120FF2E00D8074611987C +:10282000002808D014203843C2B202A8194602F08A +:102830003CF9FFB20EE0FFB202A8C2191846FFF73A +:10284000B4FF300A04D002A84670310A017001E0DA +:1028500002A806701421394302AEF2191432304630 +:10286000FFF7BCFF01951821394301AB30462246E2 +:10287000FFF7EAF9002803DB01A800880BB0F0BDE0 +:10288000012002F047F9002A06D0491E8B5C037034 +:10289000521E401C002AF9D17047F0B58DB0174682 +:1028A00006780B2E3CD201910293002E13D0401CCF +:1028B0000021182200252B46445DD2B29440E31833 +:1028C0006D1C083A042DF7D18A0003ACA350491CB3 +:1028D000001DB142EDD102F007FD684607602127D7 +:1028E00003AD3846294632462B4603F037FA2022FC +:1028F00038462946029C234603F0DCF9019800285B +:1029000005D0129921200123224603F0E3F902F0B9 +:10291000EBFC03A80021202202F0DDF80DB0F0BD91 +:10292000022002F0F7F80000F0B58DB002461078F2 +:102930000B2843D2012600283DD002960191521C5B +:102940000024182500273E46D35DEDB2AB409E190A +:102950007F1C083D042FF7D1A30003ADEE50641C8B +:10296000121D8442EDD10528029E24D10126F207D2 +:10297000039B53402C2B03D0542B01D0312B1AD165 +:1029800010490B681C88002C06D0049D5540A542B8 +:1029900002D059888D420ED16432059991420ADCE9 +:1029A00006990198814206D1074A079B012600211A +:1029B000934200D80E4630460DB0F0BD022002F022 +:1029C000A9F8C046201D002050C30000F0B58DB00E +:1029D00002461F4803681C880120002C33D0107861 +:1029E000022801D208462EE0019102930B282CD236 +:1029F000521C0025182600273B46D15DF6B2B14097 +:102A0000CB187F1C083E042FF7D1A90003AE7350EA +:102A10006D1C121D8542EDD10122D3070398584049 +:102A20002C280299019D04D0542802D03128284630 +:102A300009D1049D5D40A542104604D04A8801207A +:102A400000219542CED10DB0F0BD022002F062F817 +:102A5000201D0020F0B585B004920C4602780B2AA8 +:102A60004CD2202121700121002A3DD00499891ED9 +:102A70000191461C00230121029203931820002299 +:102A80001546B35CC0B283405D19521C0838042A55 +:102A9000F7D1C9B26018049A511A0122D2072B4605 +:102AA0009343184A7A4402F065FD2746204604996C +:102AB00006F0BCF8C1B2361D019A91421BDA002D16 +:102AC000039B01DB3C4603E027223C466254401C4A +:102AD000C1B22F226254411CC8B2002222545B1C96 +:102AE000D8B2029A9042C8D3C8B2401E00212154E5 +:102AF000C0B205B0F0BD032002F00CF8022002F0D5 +:102B000009F8C04619620000F0B587B01C461746A8 +:102B10000591064602F0E8FB0020069006AD6846E7 +:102B2000C5600C998160446007600D98002801D051 +:102B30000A4900E0084903223046059B03F0DAF811 +:102B40002878C00703D0207801210143217002F0CA +:102B5000CBFB07B0F0BDC046010400000106000039 +:102B60000A020A43FF21090251400180704780B5E3 +:102B7000FF218143000A814201D003F025F880BD86 +:102B8000F0B5002307241E46155D0F5DF619751973 +:102B900005550126FF2D00D81E46671E002C3C4619 +:102BA000F2D101200021FF2D00D80846F0BDF0B57C +:102BB00081B0002607240096155D0F5D330604D012 +:102BC000AF4204D97F1E002303E0009B01E0FF37E2 +:102BD0003346BFB27E1B06550126AF4200D31E46C8 +:102BE000631E002C1C46E7D1F0B201B0F0BD00001E +:102BF00070B582B0044601263002114D285C304287 +:102C00000DD03F20C0002A58002168460160416075 +:102C100028462830234602F0FDFF3002285C80075A +:102C20000BD53F20C0002A58002168460160416052 +:102C300094352846234602F0EDFF02B070BDC04631 +:102C40007C180020F0B581B07D208600294DA85D5C +:102C5000002848D03F20C700E8590478FC2C05D84C +:102C600001252846FFF7C4FFFF2031E0FE2C19D0D4 +:102C7000FD2C3BD10120FFF7BBFFE859411CE95176 +:102C8000A95DFF31A955C9B201292CD9417800911C +:102C9000847802252846FFF7ABFF240200980443FE +:102CA000FE2015E00120FFF7A3FFE859401CE85182 +:102CB000A95DFF31A955C9B2032914D900210A46DB +:102CC000FFF7D8FB044604252846FFF791FFFC20B8 +:102CD00008490A46D1594919D151915D401890557A +:102CE000204601B0F0BD012001F014FF022001F0E8 +:102CF00011FFC0467C180020F0B5BFB00646E94879 +:102D0000784402F00BFE857933AC204605F0D4FE02 +:102D1000A085ED0801273D4084B2002C01D000F0D1 +:102D200065FC33A803F0B4F83D90002D199700D14D +:102D300019951B951DA8C01D189025A8011D169159 +:102D400028301790F1481C961A9707466AE2072820 +:102D500000D067E23C69002C00D161E27D20850053 +:102D6000785D002801D100F030FC844200D3044695 +:102D7000002CE64F01D100F028FCE0B2FFF738FF4D +:102D80003F20C000395809193950785D001B78552B +:102D90003869001B386145E24E783446083CE1B2A0 +:102DA000302901D900F01FFCB11C1191C9B2884231 +:102DB00001D200F018FCD648784402F0AFFDD349A8 +:102DC000149D49596A46566025AB059313608A1CC9 +:102DD00008302021234602F059FFCC484059801981 +:102DE000811F08220598FFF7C9FC002800D0FAE3EC +:102DF000C64D149EA8593D21C9006A5C002A0DD019 +:102E00003A22825C3223C254A859401DA851EA5D7F +:102E1000F332EA55695C012200293DD1811C25AEBF +:102E20003046224601F041FE3078322800D0DAE305 +:102E3000B6480546149EAC591698A8512420FFF7B1 +:102E4000D7FE11996018A851E85D401AE8552F4641 +:102E50001DA808221799FFF716FD0020014602461B +:102E6000189E735C7C18257F5219D3182377012292 +:102E7000FF2B00D80246491E0C460834F1D101252B +:102E8000FF2B00D885E0AEE33D20C0009F49085CE1 +:102E90000022002800D1A6E3139201263046FFF756 +:102EA000A7FE9A4D14996858421C6A50E85DFF309D +:102EB000E855C0B2232800D895E3F5204000285CEF +:102EC000002826D034022E552420FFF791FE002042 +:102ED0000C942855149C295924312951E85DDC3083 +:102EE000E855C0B2072800D87DE30F20400128181C +:102EF0000822039201F0D9FD0398FFF779FE0C98A0 +:102F00002E54285908302851E85DF830E855139DB3 +:102F10003FE0002168460160416017200001281849 +:102F20002424234602F076FE2046FFF761FE149823 +:102F3000295824312950E85DDC30E855C0B2072813 +:102F400000D850E31DA80822FFF79DFC0020014691 +:102F50000246189B5B5C6D4C6418257F5219D31890 +:102F60002377FF2B324600D80246491E0C46083410 +:102F7000EFD1FF2B139D00D935E30820FFF738FE72 +:102F800062480146149A885808308850C85DF83065 +:102F9000C8553D20C0005D4A105C002802D10120C8 +:102FA000010250541C9E159CFFF74CFE574F386190 +:102FB000022171403D22D200BB5C2B430B43002217 +:102FC000002B214600D0114600281A9A00D1044651 +:102FD0000C4054401B98002802D1002C00D102E381 +:102FE000022038757D25AC00385D002800D1ECE268 +:102FF000396901291A9B20D13F20C600B8590078B1 +:1030000001210022AE2800D11146199A114301294D +:1030100006D101210022AE2800D111465940F9778E +:103020000120FFF7E5FDB859401CB851385DFF306D +:1030300038553969491E39611C9E002917D04D1E2B +:10304000C0B2854200D30546002D304F00D1BCE20E +:10305000E8B2FFF7CDFD3F20C0003958491939507B +:10306000385D401B38553869401B3861DAE0022E64 +:103070001ED13D21C900795C002915D0F5214900F8 +:10308000795C002914D000216846016041600F205E +:1030900040013A1838462830082302F0BBFDA8004A +:1030A000385C05E0BC6F00000121090203227A545C +:1030B000C0B2032800D896E2F52040003D21C900A7 +:1030C000795C00290ED0385C00280BD13F20C0006D +:1030D0003A58002168460160416038462830042390 +:1030E00002F098FD0420FFF783FD3F20C00039580F +:1030F000091D3950385DFC30385501203875B868E5 +:10310000401EB860F868401CF8608BE07C18002016 +:10311000046F0000F5204200B95C3D25E800385CF2 +:1031200000284FD000294DD120266846466025A9A9 +:1031300009910160172000013C180B9401210491B2 +:103140000023089320460F92099F3A460E9502F0FD +:1031500061FD204602F07EFD68460760466020461D +:10316000049D29463A46334602F054FD68464660BF +:103170001DAF0760ED4C2834204629463A46089B8F +:1031800002F048FD204602F065FD68460760466093 +:10319000204629463A46334602F03CFD0B980999F1 +:1031A000324601F082FC19200001E0490818394636 +:1031B000DE4F32461C9E01F078FC0F98395C0E9869 +:1031C000C000385C002822D0002920D0D848385CC4 +:1031D00000280BD100216846016041601B200001DE +:1031E0003A1838462830202302F014FD0A2038759A +:1031F00018E0052816D17D208400385D002800D114 +:10320000E3E13D69002D00D01BE7042076E70921AA +:103210003975002806D03846283002F01BFD01E041 +:1032200008203875397D00E03975C8B2042807DCFC +:1032300002286EDD03282AD00428F3D1B86836E0CE +:10324000062800DDBBE1D4D17D208400385D002854 +:1032500000D1BAE1032800D8C5E10420FFF7C8FC7B +:103260003F20C000E74F3958091D3950385DFC3008 +:1032700038550821FF221042D6D001242502002013 +:103280007855FFF7DFFC7C5538610721CCE7022E2B +:1032900000D13FE77D208000385C002800D194E118 +:1032A000FFF7D0FC0021B860F960042139750621D0 +:1032B0000028B9D07D208400385D002800D184E149 +:1032C000072800D88FE1012ECE4F11D101204002F6 +:1032D0003858F96881420BD13F20C0003958384630 +:1032E0001530082201F0E1FB7F20800001213954D4 +:1032F0000820FFF77DFC3F20C000395808313950C5 +:10330000385DF8303855FFF79DFC38610520387579 +:1033100071E7002806D0012802D0022882D161E698 +:10332000B868E0E00026BE60FE603E6138461530B9 +:103330000822314601F0CFFB3D462835284602F0F1 +:1033400089FC3C469434204602F084FC3D20C000B9 +:10335000385C00283AD0012000023E54F52040009D +:10336000385C00282DD068460660466077208000D3 +:103370003A1804232846314602F04CFC68460660A1 +:103380004660172000013A18079220200690284630 +:103390003146069B02F03EFC6846066046601920F6 +:1033A00000013A1828463146069B02F033FC684675 +:1033B00006604660602320463146079A02F02AFCE8 +:1033C00004E017200001381802F044FC7D20109022 +:1033D0008600B85D032800D805E13F20C500795973 +:1033E000772080001290381804240A90224601F0B9 +:1033F0005CFB2046FFF7FCFB7859001D0D957851CA +:10340000B85DFC30B8558049795C002917D0C0B24E +:10341000032800D8E7E07B4F0D9D79594920000132 +:1034200038180424224601F040FB2046FFF7E0FB59 +:103430007859001D7851B85DFC30B8551FE07348CD +:1034400000684021405C16280A9C18D80121814060 +:103450006F48014213D0002120460A46FFF70AF8C0 +:1034600000280CDA002120460A46FFF703F86949D4 +:10347000884204DB109880006249085CC7E7634813 +:1034800000684421415C890718D5007A022806D0DB +:10349000042813D15B481299405C01280ED8594C7E +:1034A000A05D032800D89EE00420FFF7A1FB0D9942 +:1034B0006058001D6050A05DFC30A055FFF7C2FBB6 +:1034C000504FB860252149011C9E022E524A08D156 +:1034D000795C002905D05168002900D15060002195 +:1034E00011600121397500281DD07D2039468700E3 +:1034F000C85D002869D00124022E1BD0012E25466C +:1035000000D051E523286ED92420FFF771FB3F201E +:10351000C0003C490A46115824311150D05DDC30BE +:10352000D055012540E5032038757BE67C18002046 +:103530008E040000012856D93F21CA001492314957 +:1035400089580A78022A159400D19DE4012A00D1F5 +:1035500022E4002A47D13D20C0002A49085C002807 +:1035600041D12E4C7C44204602F0D8F98088FFF7E8 +:10357000FEFA204602F0D2F98088C0B2042806D0B4 +:10358000022804D001282ED11B9800282BD01D4CD6 +:10359000149D6059401C6051E05D401EE055C0B272 +:1035A000232820D92420FFF723FB605924306051C1 +:1035B000E05DDC30E0550120A0770025E9E401461C +:1035C0000839032901D3FFF7C2FB02F055FC33A9E8 +:1035D000884202D13D9802F05BFC33A8808D002820 +:1035E0000DD13FB0F0BD012001F094FA33A80025C1 +:1035F00085853D9802F04CFC02480575204601F097 +:1036000089FAC0467C1800208E040000201D00208E +:10361000800140000300008000180020586700006F +:10362000F0B581B000900B09012213405B42194CA8 +:103630001C40CD0815406D42174E2E404701774083 +:1036400067404C09144064421448204078408E0979 +:1036500016407642124F37404740C809104040425A +:10366000104A02407A4098272F40009DED0E4901F4 +:103670002943C9B2794079251D404D40F3212140AD +:103680006940AE2333404B401E2101405940104653 +:1036900001B0F0BDE2996DB7618EBCF2C4B35F3E7C +:1036A000A8E2AB2E70E4434FF0B581B015460E464C +:1036B00007463C78012000210090FFF7B1FF002C65 +:1036C00012D07F1C1F22224042403C781046FFF758 +:1036D000A7FF7F1C002CF5D106E0FFF7A1FF0246F3 +:1036E000307850406D1E761C002DF6D10824FFF76F +:1036F00097FF641EFBD1009A504001B0F0BD00005E +:1037000070B514460A4601460D487844FFF7CCFFD1 +:1037100023220546D54020239E1A0B46B3402B4357 +:103720001646203E0D46F540002E00DA1D461F23AA +:103730002B402370531F641C002A1A46E9D170BD28 +:103740004E560000F0B599B01D4603460020179074 +:103750001690107014296FD11E990020002904D0F2 +:10376000012969D10192082000E001920CAF387064 +:10377000781C1422194601F098F9152100263246CA +:1037800030463B7800021843134608337F1C491E1D +:103790000224E443A2420EDB0D3213460A3B0446E8 +:1037A000DC401F23234002ACA355521F761C092A7C +:1037B000F3DC521F00E01A460029E2D1002A019FE3 +:1037C00007D00521891A88401F21014002A8815590 +:1037D000761C02A816AA3146FFF792FF0020002EA1 +:1037E000394611D002A801780023144A7A442029CE +:1037F00020D2581CAB421DD202ACE45C145DFC54D8 +:10380000B0420346F3D3391800220D4B7B4416AC6B +:103810002478202C0ED28418641CAC420AD816AC32 +:10382000A45C1C5D8C54521C082AF0D300238B54DA +:10383000801801E00020387019B0F0BD7855000004 +:103840005855000070B594B014460A46014601A8C8 +:10385000FCF7F3FB01460020002912D001A80278F2 +:1038600000216B461960011D21250CAE2846334608 +:1038700002F074FA202228463146234602F01AFA52 +:10388000012014B070BDF0B59DB0144613AAFFF727 +:10389000D9FF0025002811D021266F4613AA012543 +:1038A000304639462B4602F015FA08373846FEF7FF +:1038B000A1FB20463946324601F0F7F828461DB0F4 +:1038C000F0BD0000F0B58BB00746119C012F17D05A +:1038D000129E032F12D1212205AF084611463A4607 +:1038E000FEF763FF0025684605601421384622462E +:1038F0003346FFF727FF002836D136E0022F25D1C7 +:103900000393049405A81425457000240470861CB4 +:103910002122084611463246FEF747FF022F0DD1FD +:103920001099002908D068460560002204983346A3 +:1039300002F0BCF8002817D1002516E0684603996C +:1039400012C005A816219623049D09E025460024EF +:10395000684614C00648301883B221220846114632 +:103960002A46FEF751FF2C54012528460BB0F0BD26 +:10397000FFFF000070B59AB00E460446206900258E +:1039800000282AD0217BA068401CFF31C9B211AAAF +:1039900000252B46FFF777FF00281ED0F388B2885A +:1039A000A0680078716B33256E46B56004AD22C601 +:1039B00011A9FFF787FF002500280ED0246904AD68 +:1039C000284605F09BF8421C2846214604F04EFF8D +:1039D00001250021002800D00D4628461AB070BDF0 +:1039E000F0B585B00A4606460020B07334460E3462 +:1039F000317B082927D803AF0021019108253846DB +:103A000002922A4601F067F8327BA81A3818B1688A +:103A100001F04BF8029D2735284605F06FF8C6B235 +:103A200020462946324601F040F82020A055A01932 +:103A3000421C0298416C3846FEF7A2F93018201853 +:103A400001994170012005B0F0BD000070B598B03B +:103A500004466D466021284604F0F2FEA16928461E +:103A60001C30402205F0ACF85C20295C00200029C5 +:103A700017D1227B082A14D8267D082E11D86D462E +:103A8000A81A1430A16804F0E1FEA81B1C302169BB +:103A9000324604F0DBFE04486022294604F0D6FEDC +:103AA000012018B070BDC0460018002010B50C49A8 +:103AB0000860FEF72FFA252040010A4901240C5422 +:103AC00001F062F92102084804F0BAFE002003F078 +:103AD0003FFE204603F03CFEFCF780FB10BDC046D5 +:103AE000201D00207C180020241D002080B50648E1 +:103AF0000078002801D104F089FC044979440020B1 +:103B0000024604F031F880BD241D0020A4570000B7 +:103B100080B582B001900648784401F0FFFE29305C +:103B200001A9012202F05AF8FFF7E0FF02B080BDC0 +:103B3000A461000001460020022903D88800024940 +:103B4000794408587047C046BC56000080B501282B +:103B500005D0002807D10020FFF7DAFF80BD012043 +:103B6000FFF7D6FF80BD002003497944034A7A4419 +:103B700004F046FC80BDC046130000002700000092 +:103B800001460020012903D88800024979440858D9 +:103B90007047C0467C56000080B5002802D0FFF771 +:103BA000A5FF80BD0648784401F0B8FE2921435C9A +:103BB000002004497944044A7A4404F003FC80BD9F +:103BC000166100007DFFFFFF91FFFFFF80B5002021 +:103BD00003497944034A7A4404F012FC80BDC0468C +:103BE000ABFFFFFFBFFFFFFF80B5FF2002F010F922 +:103BF00080BD80B50120FCF77DFEFFF777FF80BD1B +:103C000080B50020FCF776FEFFF770FF80BD80B521 +:103C10000120FCF76FFEFFF769FF80BD80B5002033 +:103C2000FCF768FEFFF762FF80BD80B50020FCF75F +:103C300061FEFFF75BFF80BD80B50120FCF75AFEF7 +:103C4000FFF754FF80BD80B500200146FDF7C8FC9A +:103C5000FFF74CFF80BD80B501200021FDF7C0FCBF +:103C6000FFF744FF80BD80B50020FCF743FEFFF75F +:103C70003DFF80BD80B50120FCF73CFEFFF736FF1D +:103C800080BD80B50178490601D001F0F3F880BD10 +:103C9000B0B50546072028400024012814D002288A +:103CA00014D1002909D00B4802F0BEF868B20028F0 +:103CB0000ADA01F089FF002406E0FF2152310548AD +:103CC000002202F0C9F804462046B0BD022000F0F0 +:103CD00021FFC046E81F0020F0B581B0E04D2878F4 +:103CE0000C2810DD0D286CD00E2800D1C7E0152857 +:103CF0000FD1DC48807901280BD1A879000708D4BE +:103D0000102000F007FF052800D111E10C2800D198 +:103D100081E2D54C0027676001202070204602F028 +:103D200047F8042002F0C0F86060692800D05DE127 +:103D300001F044F801F044F8BE25F84E7753042012 +:103D400002F0B2F86060002800D164E2972800D148 +:103D500061E2C0243059002800D15CE2705BAA27E0 +:103D6000C421715C80B2884200D354E202F068F84A +:103D7000002800D04FE201F0E5FFB84204D102F084 +:103D80000BF8B84200D046E23059715B4901401847 +:103D9000CC217158002902D0884700280AD0012878 +:103DA00003D13059715B490140180178490601D0AF +:103DB00001F060F8705B401C705331590029CFD17D +:103DC00029E2D54C0027676001202070204601F0D1 +:103DD000EFFF042002F068F86060002800D11AE2CA +:103DE000972800D117E2692800D099E100F0E6FF9A +:103DF00000F0E6FFBE25C94E7753042002F054F8C8 +:103E00006060002800D106E2972800D103E2C024B8 +:103E10003059002800D1FEE1705BAA27C421715CF3 +:103E200080B2884200D3F6E102F00AF8002800D000 +:103E3000F1E101F087FFB84204D101F0ADFFB842D3 +:103E400000D0E8E13059715B49014018CC2171582C +:103E5000002902D0884700280AD0012803D1305910 +:103E6000715B490140180178490601D001F002F860 +:103E7000705B401C705331590029CFD1CBE1EA4D22 +:103E800000276F6001202870284601F091FF042070 +:103E900002F00AF804466C60692C00D0E6E000F0FD +:103EA0008DFF00F08DFFBE24E04E3753042001F05B +:103EB000FBFF6860002800D1ADE1972800D1AAE19E +:103EC000C0257059002800D1A5E1305BAA27C42184 +:103ED000715C80B2884200D39DE101F0B1FF0028FF +:103EE00000D098E101F02EFFB84204D101F054FF58 +:103EF000B84200D08FE17059315B49014018CC21A4 +:103F00007158002902D0884700280AD0012803D11F +:103F10007059315B490140180178490601D000F021 +:103F2000A9FF305B401C305371590029CFD172E199 +:103F3000BD4C0027676001202070204601F038FF4B +:103F4000042001F0B1FF6060002800D163E19728F0 +:103F500000D160E1692800D018E100F02FFF00F0E7 +:103F60002FFFBE25B14E7753042001F09DFF606006 +:103F7000002800D14FE1972800D14CE1C0243059EE +:103F8000002800D147E1705BAA27C421715C80B290 +:103F9000884200D33FE101F053FF002800D03AE10E +:103FA00001F0D0FEB84204D101F0F6FEB84200D0D4 +:103FB00031E13059715B49014018CC217158002919 +:103FC00002D0884700280AD0012803D13059715BFC +:103FD000490140180178490601D000F04BFF705BA1 +:103FE000401C705331590029CFD114E1C0258F4CAA +:103FF0006059002800D106E1BE26A05BAA27C42193 +:10400000615C80B2884200D3FDE001F019FF002816 +:1040100000D0F8E001F096FEB84204D101F0BCFEF9 +:10402000B84200D0EFE06059A15B49014018CC21B3 +:104030006158002902D0884700280AD0012803D1FE +:104040006059A15B490140180178490601D000F090 +:1040500011FFA05B401CA05361590029CFD1D2E0D1 +:10406000241E00203C210020501F0020D8206F4D2E +:104070002958002911D0642264290B4600D3134625 +:10408000CA1A2A50D421002A07D16958002904D01D +:10409000DC22AA582A5000208847002C00D1BAE020 +:1040A000972C00D1B7E0C024285900282FD0BE2675 +:1040B000A85BAA27C421695C80B2884227D201F09C +:1040C000BFFE002823D101F03DFEB84203D101F02C +:1040D00063FEB8421BD12859A95B49014018CC2185 +:1040E0006958002902D0884700280AD0012803D146 +:1040F0002859A95B490140180178490601D000F010 +:10410000B9FEA85B401CA85329590029D2D1C4206C +:10411000285CBE21695A7AE0501F0020241D00202F +:10412000C025424C605900286DD0BE26A05BAA274E +:10413000C421615C80B2884265D201F081FE002812 +:1041400061D101F0FFFDB84203D101F025FEB84274 +:1041500059D16059A15B49014018CC21615800290F +:1041600002D0884700280AD0012803D16059A15BFA +:10417000490140180178490601D000F07BFEA05BA0 +:10418000401CA05361590029D2D13CE0D020274CDB +:104190002058002803D0E978490800F0AFFEC02578 +:1041A000605900282FD0BE26A05BAA27C421615CDD +:1041B00080B2884227D201F043FE002823D101F0CB +:1041C000C1FDB84203D101F0E7FDB8421BD16059EF +:1041D000A15B49014018CC216158002902D08847D1 +:1041E00000280AD0012803D16059A15B4901401879 +:1041F0000178490601D000F03DFEA05B401CA053B1 +:1042000061590029D2D1C420205CBE21615A81426B +:1042100001D301F015FE01F013FE002801D100F0DA +:1042200081FC012001B0F0BD501F0020241D0020A2 +:10423000F0B5A5B01E4614460F460546FEF704FA33 +:10424000002807D0A74979440A22204604F0FEFA44 +:1042500025B0F0BD0494A14800684024005D1128F9 +:1042600044D128463946FEF74EFA03909B48006831 +:10427000005D11283AD128463946FEF707FA002892 +:1042800012D07B208000039C002C07D09449085C4E +:10429000002803D0083D2846FDF7C8FE002C0498EE +:1042A0007ED0924979447DE08C480068005D1128F9 +:1042B0001CD128463946FEF721FA002816D07B206B +:1042C00080000399002907D08549085C002803D0A5 +:1042D00028460838FDF7AAFE2C78FD2C7F4F64D1C4 +:1042E0006878A97809020143C81C5FE02846FDF7F9 +:1042F000B1FF002810D079480068406B0028A7D093 +:1043000001F00CFB0146A8786A461060EB1C002205 +:10431000049801F0CBFB9BE7704F3868C4882846AF +:10432000FDF712FF0321002802D038688488042199 +:10433000200A04D005AA54701070022702E005A8D4 +:104340000470012705A8C0196918142503902A468E +:1043500000F0ABFBFF20EA306149085C002810D078 +:104360005E480068C28801200021944200D00846BF +:104370006946086014210398049A3346FFF7E2F96E +:1043800066E7012069460C6048602F43B9B2B3B2BA +:1043900005A8049C2246FEF737FA0021215457E76E +:1043A0005149794404F0A2FB52E7601C29181539E1 +:1043B00020AE1422304604F049FA307800281CD090 +:1043C000002020A94E4A7A440B781C09145D05ADE3 +:1043D0002C542C180F251D40535D6370491C801C04 +:1043E0002928F1D3282005AB002119544121454A41 +:1043F0007A44049801F0BEF82AE703200121FD2C3D +:1044000000D00846295C4018295C41180398002810 +:104410000CD0685C0818401C295C00290AD04C2983 +:1044200009D1291849784018801C04E068184078A0 +:10443000891C09E0401C291849784018801C295C17 +:104440000818401C295C491C08182A5C411C4C2A8D +:1044500000D001466C186078A17809020143E07829 +:10446000227912020243100408431F901FA820491A +:104470007944042204F070FB00280DD01FA81E49C7 +:104480007944042204F068FB002800D0E0E61B49D0 +:1044900079440B220498D9E63D68287919AE30702A +:1044A00021461131701C15273A4604F0CFF9A8882F +:1044B00001216A4603C205AD5023304639462A46DB +:1044C000FEF7A2F9002129544420205C69460860C7 +:1044D0004121084A7A4404982B468BE7201D00208E +:1044E0007C1800206A530000BC4D0000A94E00005B +:1044F000F84C0000994C0000084D00002C510000C1 +:10450000C74D0000AE4D0000F0B597B001AD50248E +:104510002846214604F094F94548464F391815A815 +:104520000822FEF7B0F9444838187B2189002A4652 +:104530002346FFF77DFE414E40223046294604F0D7 +:104540003FFBA3208000385C142811D13C48381868 +:1045500040497944042200F0C7FA002808D13948BC +:1045600038183D497944042200F0BEFA00282FD0C3 +:10457000354C374626682736304604F0BFFA0246E7 +:104580003D4641352846314600F08FFA26682736E9 +:10459000304604F0B3FA2021295430463E4604F058 +:1045A000ADFA2818401C83218900224A505015A8D2 +:1045B000FDF7A0FC05462068273004F09FFA281874 +:1045C000401C3018412100224254012017B0F0BD98 +:1045D0001E48381801210022FDF74CFF03463046E3 +:1045E00041301F2B06D0032B07D0012B0BD11B49C9 +:1045F000794404E01A49794401E01A4979440622D1 +:1046000004F024F904E01421174A7A4400F0B2FFC0 +:1046100035464135284604F071FAC4B22819832181 +:10462000890078500A483818FDF764FC2018C8E75C +:10463000820200007C1800208A020000001800207E +:104640008D02000091020000201D00209502000054 +:10465000990200005D4C000063500000C44B000054 +:10466000C44B0000C44B0000BC4B000070B58CB0C4 +:1046700020206946486004AE0E600C4894300C4D12 +:104680002A46413201240023214601F0C3FA68463C +:10469000082306601836436086604121054A7A4443 +:1046A000284600F067FF20460CB070BD7C18002043 +:1046B00000180020374B000010B5252040010D4C9C +:1046C000215C0020002900D010BDFFF71DFF8F20C6 +:1046D000C000205808496158491C0B1A074855303A +:1046E0001421074A7A4400F045FFFCF7FDFC012045 +:1046F00010BDC0467C1800207C040000001800207B +:10470000FD4A0000B0B582B025204001164D285C5E +:10471000A97F01430024002902D0204602B0B0BD89 +:1047200012482A18294615316846FEF740FA002833 +:10473000F3D00F48285C01240328EED100206877CD +:10474000F52040003D21C900695C002907D0295CA3 +:10475000002904D101242C5400202875DDE70A200B +:1047600028750124D9E7C0467C1800208504000084 +:104770008404000080B5FFF779FF0120FDF742FABD +:1047800080BD000010B5044604497A22FEF762F9A4 +:1047900000212046FEF7C8F810BDC04600180020D2 +:1047A00010B5074CC834204604F0A8F92021215444 +:1047B0002018002141700120FCF79CF810BDC04674 +:1047C000E81F002080B5034979440020024603F029 +:1047D000CBF980BD544B000080B5034979440020DB +:1047E000024603F0C1F980BDB04B000080B5054919 +:1047F0007A22FEF72FF9044979440020024603F09B +:10480000B3F980BD00180020384C000080B5054980 +:104810007A22FEF71FF9044979440020024603F08A +:10482000A3F980BD00180020C44C000080B50349E6 +:1048300079440020024603F097F980BD684D0000DE +:1048400010B58CB06C46204604F036F9A0850D49B1 +:10485000084206D1684601F01BFB0A90FF2001F0D8 +:10486000D7FA01F009FB6946884202D10A9801F0A3 +:104870000FFB6846808D002801D10CB010BD00F000 +:1048800049F9C046FFFF0000F0B59FB00446002C78 +:104890002FD10DAC002648222046314600F01BF9EE +:1048A000032525720D9633480E9020460930344971 +:1048B00079440526324603F0C9FF20461730314FB0 +:1048C0007F443946324603F0C1FF2046273039463F +:1048D000324603F0BBFF26462D362B49794430463D +:1048E0002A4603F0B3FF4020112121541A960420D8 +:1048F0001E9021480460214C01200102204603F053 +:104900009FFF01AD284604F0D7F8A88585B2002D99 +:104910000BD001A8002181850B9801F0B9FA0B9802 +:1049200001F0B6FA102DE7D01FE001AD284601F0E6 +:10493000AFFA0B9000F028FAFDF7ECFA002002F035 +:1049400007FF012002F004FFFFF7D0F8FBF746FC59 +:1049500001F092FAA84202D10B9801F099FA01A84D +:10496000808D0028C8D000F0D5F8FFF769FF1FB090 +:10497000F0BDC0463A003200201D0020241D00205A +:104980003C490000314900001A490000F0B59FB0D1 +:104990000446A068002831D10DAD002748222846E2 +:1049A000394600F098F80320009028720D97374898 +:1049B0000E90284609303749794405273A4603F0D6 +:1049C00045FF28461730344E7E4431463A4603F0C0 +:1049D0003DFF2846273031463A4603F037FF2E4642 +:1049E0002D362E4979443046009A03F02FFF40209F +:1049F000112129541A9604201E90A5600027244EE8 +:104A000001AD284604F058F8A885304207D101A826 +:104A100001F03EFA0B90F8070FD001F0D5F901F044 +:104A20002BFA01A9884202D10B9801F031FA01A8B2 +:104A3000808D002828D10127E2E70A2001F0B8F88C +:104A40006068022817D004280BD00328E5D1E0685D +:104A500000218161A168E068FEF78CFFE168886150 +:104A6000DBE7E0680021C162A168E068FEF7B8FFFB +:104A7000E168C862D1E7E068FEF7E8FF0028CCD023 +:104A8000A068FFF713F8C8E700F044F83A003200D6 +:104A9000FFFF0000344800002948000012480000D1 +:104AA00080B5002001F0F4F980BDB0B5884208D986 +:104AB000002A0FD0491E401E8B5C8354521EFBD12E +:104AC00008E0002A06D000239CB20D5D05555B1C52 +:104AD000521EF9D1B0BD80B50B46002A03D0114655 +:104AE0001A4603F0BBFE80BDB0B50023002A0FD0EC +:104AF000401E491E8C5C855C521EA54202D1002AD4 +:104B0000F8D105E00020C0430123A54200D80346A8 +:104B1000D8B2B0BD10B5044601F0AEF9214603F09D +:104B2000D7FF000080B501F08BF9002800D080BDD0 +:104B30000648002141706022027002228270C1701A +:104B40000171052101F070F980BDC046241E0020CE +:104B5000B0B51A48C078032807DC01280DD0022818 +:104B600028D1174802F073F9B0BD04281FD00828D7 +:104B700020D1134802F069F9B0BD114C0121204643 +:104B800002F05EF9204602F03DF90E4CA0790028B3 +:104B900011D120460C30002504222946FFF79BFF47 +:104BA0001034082220462946FFF795FFB0BD04487F +:104BB00002F049F9B0BD1020FFF7ACFF241E002021 +:104BC000FC2100203C2100207F21014000200329FE +:104BD00003D8C8B201490818007B70473C21002067 +:104BE00080B516480179042918D0022906D0012978 +:104BF00022D1811D134802F00DF880BDC2787F21BB +:104C00001140032918D8C9B24A000D4B9A18002345 +:104C10001382821D0B4802F082F880BDC2787F218A +:104C20001140032908D8C9B2054A521843791373B1 +:104C3000821D044802F01CF880BDC046241E0020DE +:104C40003C210020FC21002070B515460E4604468C +:104C5000FF2D1BD80E485021017020210171457194 +:104C6000E91C817080222243C270090A417006212A +:104C700001F0DAF83046294601F0D6F87F202040CE +:104C80004000044908187D210901018270BDC04619 +:104C9000241E00203C21002080B50A4601468220C7 +:104CA0001423FFF7D1FF80BD80B50A46014683205B +:104CB0001423FFF7C9FF80BD80B50C480178002997 +:104CC00000D080BD062181710A21017008498B78CE +:104CD0004A7812021A43FF232A339A4200D31A4613 +:104CE0004280C91C0348FFF7E0FE80BD3C21002044 +:104CF000241E0020E81F0020B0B5204882784178AB +:104D00000902114300780F280ADC0E2810D00F2862 +:104D100023D10020012927D1FFF71AFF0120B0BDC0 +:104D200010281ED0162818D1FFF7C6FF0120B0BDED +:104D300013488168643181601621124A435A002B5E +:104D400008D06424642B1D4600D325465B1B4352C8 +:104D500013420ED0891E0E29F0D10220FEF7BCFFAF +:104D6000B0BD0020032900D2B0BDFFF739FF0120FC +:104D7000B0BD002101701020FFF7CCFE241E0020E2 +:104D80003C210020FFFF0000B0B50A2000F010FF1A +:104D9000084C0025182220462946FFF79CFE658016 +:104DA0002570A571A56000F061FB034805604560B2 +:104DB000B0BDC0463C2100205421002070470000B7 +:104DC00002480021016041607047C0465421002024 +:104DD000F0B589B00546084600F0A0FD0446002C59 +:104DE00043D02069002840D0284600F097FD0146B6 +:104DF00002AD1C2228460192FFF757FE2168E98088 +:104E000062682A81A0681A4F65233B7089B292B20A +:104E10004A434243D1084E1C07231A4200D10E4692 +:104E2000314600910426864070181D30B870000A83 +:104E300078700321384600F0F7FF2846019900F00A +:104E4000F3FFA06838700121384600F0EDFFE068FC +:104E500000F064FDB1B200F0E7FF009885B2206970 +:104E600000F05CFD294600F0DFFF09B0F0BDC04650 +:104E7000241E002070B500F051FD044620787F26E6 +:104E8000064000F0DDFF002830D1002E2ED0E06972 +:104E900000281DD000F042FD0546052E02D1A07E5F +:104EA000002824D0284603F029FE06461248652132 +:104EB000017031461C318170090A4170032100F0F4 +:104EC000B3FF1C21204600F0AFFFB1B228460BE033 +:104ED000094800214170652101701C25857003215E +:104EE00000F0A2FF2046294600F09EFF70BD20463C +:104EF0002946FFF76DFF70BD241E002070B50446E3 +:104F0000002C28D01448066845688E4201D16D1CDB +:104F100045600E43002902D00660324605E00022BB +:104F2000026042600D4B5B1C1E438A4201D000218F +:104F30004160082D0CD30321284603F091FB012288 +:104F400090073043002900D03046D107884300E065 +:104F500030462946A04770BD54210020FFFFFF7F47 +:104F6000F0B581B00F4E01243470B11CFF275037CB +:104F70007A1C204600F03EFF054675707A1B7719B3 +:104F8000F91C022000F036FFB8702D187619F47065 +:104F900000F024FF3071902070710020B071E81D86 +:104FA00001B0F0BDE81F0020F0B58BB00A46064600 +:104FB00007210E4207D03346D8B291B2FEF768FE01 +:104FC00080B20BB0F0BD4B20840083200390AA4D2B +:104FD000A84F3346019109E06920A9490870039858 +:104FE000801C487002220199079B2DE11021304658 +:104FF0000840049292B20592002A069600D1B5E0CC +:10500000002800D0B2E007930091029007E0A1B21F +:105010000022384600F020FF012000F03FF900F0A8 +:105020000FFF0028F3D17D200001A9680E18287811 +:105030000928079A42DC072848D0092863D10021B3 +:105040008E48079101F0F8FB10E0FFF76BFDA1B26D +:105050000022384600F000FFA868B04200D3FEE00E +:10506000FFF74AFE00F0ECFE0028F0D1834801F083 +:1050700039F90028E9D0059AD01D4008A92800D3A5 +:10508000F3E003980D307E4B9854981807994170BF +:10509000581D0499891C8AB205921946FFF705FD2F +:1050A000052277480799FFF716FD0598401D83B242 +:1050B00072480399724A01F0D3FB3FE00A28049931 +:1050C0000AD00B2822D17148784401E06E48784418 +:1050D000059900F035FA31E02046253080B2059E72 +:1050E000864200D9C1E053203870B970080A787040 +:1050F0000321384600F098FE6148314600F094FEE6 +:10510000002028701DE0002800D1ABE0D0B2059946 +:10511000FEF7BEFD002811D0A4E0FFF703FDA1B209 +:105120000022384600F098FEA868B04200D396E00E +:10513000FFF7E2FD00F084FE0028F0D12878002877 +:10514000EBD10020A87128706880069EB10600D5BA +:1051500036E7FFF7E7FC30060298009906D508917C +:1051600008AA484B1846114601DF0298002804D1CE +:1051700070066ED40020A87128700020688000F0AE +:105180005FFE002801D1FFF7CDFCA1B20022384616 +:10519000079200F061FE022806D8B9787A781202E8 +:1051A0000A43D11C81423DD1FFF7A6FD68882978CA +:1051B0000029E4D00028E2D0354979440422304E59 +:1051C0003046FFF791FC00282ED032497944042262 +:1051D0003046FFF789FC00282BD02F497944042260 +:1051E0003046FFF781FC002837D103982730C6B23C +:1051F00000F0D2FDB04200D0EEE60120204E30702B +:10520000B01C402100F0BAFD7070811C184A121DBC +:105210001140039B0D337354C11C11400023735480 +:10522000021D10E00020A7E7FFF79AFE02460023C8 +:1052300009E00020707003980D30307080200699CE +:10524000014302220B460199DEB20B4200D1CDE6AA +:10525000B2E6688806494018B2E66888B0E61020D1 +:10526000FFF758FC0920FFF755FC0220FFF752FC1E +:10527000FBFF0000241E00203C2100205C210020B8 +:10528000E81F0020BE9A0060C7FBFFFFDDFBFFFFA9 +:105290001244000005440000FA43000070B50446C3 +:1052A00000F0CEFD002801D1FFF73CFC4B2081002F +:1052B0000B4E002530462A4600F0CEFD30781528EA +:1052C00006D8012181400748014201D0002C05D1B8 +:1052D000FFF712FD0125002800D10546284670BDC4 +:1052E000241E00202070200010B5FFF71BFC084C86 +:1052F0004B2081000022204600F0AEFD20780E28D1 +:1053000001D0FFF7F9FC00F09BFD0028F0D110BDA3 +:10531000241E0020F0B581B000920F4604464B4E8B +:10532000B74210D0494D0021402628463246FFF7AB +:10533000D2FB00984028024600D332462846394620 +:10534000FFF7B3FB414EB07801280ADC002828D0D3 +:10535000012869D1F01C042100F04EFC40213046A8 +:105360002BE0022827D005285ED13079F178090298 +:105370000143374C2068002781425BD12068002818 +:105380001ED03448009D2918334A13686D1FADB2F2 +:10539000AB4200D21168051D0D4030480068711DF8 +:1053A00034E0F01C002704223946FFF794FB40212B +:1053B0003046A0473EE025484021A047002739E07D +:1053C000B0797179090201432548016001684908F3 +:1053D000A8292FD80168204801607178327812021C +:1053E0000A4320490A601D491F4A0A60009D691F3F +:1053F0008AB218495218D21C0368ED1FADB2AB42F5 +:1054000000D202680D1D1540F11D17482A46FFF70E +:105410004CFB11480168491B01601048016849199B +:1054200001602068401C20600B48016801200227B1 +:10543000002907D10648002101600848016006489C +:1054400001603846C0B201B0F0BDC046A0210020C6 +:10545000E0210020FBFF0000E8210020EC210020DB +:10546000E4210020F0210020E81F00200348002153 +:10547000016003480160034801607047E02100209B +:10548000EC210020E8210020F0B581B0264F3A68D9 +:10549000264C2168002921D0002A1FD00090264DDB +:1054A000002140222846FFF716FB0520A87023485C +:1054B0000168090A2970006868701D490868000AB7 +:1054C000E870086828710968206800290ED03B261A +:1054D0003B2800D826683968681D12E0144800216E +:1054E000016039601348017021601BE039263928BA +:1054F00000D826682068000A68712068A871396899 +:10550000E81D3246FFF7D1FA009A09492068801B4E +:1055100020603868801938600868401C08600648B8 +:105520004021904701B0F0BDEC210020E82100208F +:10553000E02100203C210020A0210020F0210020BB +:1055400080B500290BD0064A00231360054A11607C +:10555000054A064B1360064A1160FFF795FF80BDB0 +:10556000E0210020E8210020EC210020E81F00209D +:10557000E421002081B0F0B58EB015460C460690AF +:105580001393022C00D2BAE10698002800D1B6E1AC +:10559000002D00D1B3E10698214603F051F913A87C +:1055A00009902978002900D1A9E1671E002602E0B0 +:1055B000A8194178761CC8B2002801D02528F7D157 +:1055C000BE4200D33E46069C20462946324603F0A2 +:1055D00041F9BF1BA4190694002F00D18FE1A95DEA +:1055E000AD19252900D087E16B1C002020210A225B +:1055F00008920490059007900446084604E0099933 +:105600000A1D0992096804911D46224629786D1CDD +:1056100000242D29F9D0472918DC2F2926DD0B4637 +:10562000303B0A2B00D366E13029044600D10C46FA +:10563000079B002B00D004460A23079843435818C1 +:10564000303807902B4620461446DDE7672904DDF5 +:10565000722921DD73293AD122E062293CDC4829F4 +:105660004BD1014601200590084617E0252958D066 +:105670002A2926D02E2900D03DE129782A2900D0D8 +:105680003AE16A786B1C01242A21482AB7D0682A9B +:10569000B5D0732AB3D02FE1682936D110210891F3 +:1056A00009990B1D0993032313400968012B00D1AD +:1056B000BBE0022B00D1BAE0032B2B461446A3D04B +:1056C000C6E02978022473292B4698D014E1752965 +:1056D00029D078291CD00EE1632900D19BE06429F0 +:1056E00000D008E1029003970998011D0991006814 +:1056F000C11742184A40C00F1CE0582900D0FAE0F8 +:10570000014601200590084602E0702900D0F2E031 +:10571000029003970998011D099102680020102743 +:1057200009E025207BE0029003970998011D09916B +:10573000026800200A27012497420892049012D898 +:10574000012638460446394602F004FFB04209D12A +:10575000384660430799491E0791089988422646B2 +:10576000F0D900E034460798411E049B002B00D17D +:1057700007990026F243002B029800D11A460192A5 +:10578000C2B2302A06D1002B04D00AA82D23037000 +:1057900000230126881E0D280BD80AA83043491E75 +:1057A000049303F05BF8049B079880190199401853 +:1057B000461E002B03D00AA82D218155761C059882 +:1057C000002C1AD0002802D05348784401E05148F8 +:1057D000784407900898214602F0BCFE394602F052 +:1057E0003FFF0798405C0AA988552046394602F0D9 +:1057F000B1FE761CA7420446ECD9039FBE4200D3FB +:105800003E460AA9069C2046324603F023F8BF1BF9 +:10581000A41906946DE00998011D09910068069984 +:1058200008707F1E491C069163E0049E16E008780C +:10583000002860D10499B94200D339462022069C41 +:105840002046049103F00AF804983F1A24183DE01A +:1058500000228B5C521C002BFBD1561E089810288E +:105860002AD1002E47D000243B46085D0F2202407B +:105870000009022B1F4642D3059B002B05D0012BAC +:105880000ED10794224B7B4402E007941F4B7B44CC +:10589000D2B29A5C069C6270C0B2185C2070079C01 +:1058A0003846871E02282AD0641C0698801C069061 +:1058B000B4423B46D9D30DE0BE4200D33E46069CDF +:1058C0002046324602F0C6FFBF1BA4190694002FE3 +:1058D000079C14D0B4420ED9A41BBC4200D33C4652 +:1058E0002022069E3046214602F0B8FF3F1B3619A3 +:1058F0000696002F03D02978002900D056E6002014 +:105900000EB0F0BC02BC01B00847C0464D3D0000DF +:10591000653D00000B3E0000213E000080B50449BB +:10592000884204D30349884201D200F005F880BDC3 +:105930000000D0C0009DD0C07A460249C91C891A17 +:10594000401A70473959D0C010B54101104A0A4079 +:10595000430E01210B405B420E4C1C405440820E12 +:105960000A4052420C4B13406340C20E0A4052425E +:105970000A4C14405C40020F0A405242084B13404C +:105980006340400F0840414206480840584010BD5F +:10599000E0FFFF3FB2576A3B6D8E5026FA19A11EF9 +:1059A000DD33423DB362142AF0B587B0059304920B +:1059B000064602910D7800270120002D03971BD089 +:1059C0000298401C0690012000272C460197214692 +:1059D0004139E2B2202A5FD3C9B21A295CD3FFF75A +:1059E000B3FF01460698C25DE020044060094840CC +:1059F0007F1C002A1446EAD10599C919C91D5A29E4 +:105A000003994CD8FFF7A0FF002D0ED002994C1C33 +:105A1000FFF79AFF014635701F2028404840611C5F +:105A2000761C2578002D0C46F2D131213170711C85 +:105A300006910599002914D000241A4E7E4403943F +:105A400004990F5D1F2F29D8F55DFFF77DFF06999B +:105A50000D557840641C05998C42F1D306990919BB +:105A600006910624FFF770FF641EFBD10121484018 +:105A700019220D497944069B0446D4401F25254030 +:105A80004C5D1C70541F5B1C002A2246F4D1002080 +:105A900006998871012102E0019900E00399084606 +:105AA00007B0F0BD28330000F0320000F0B595B02B +:105AB0000C46054600200390102A1EDC1A99002A85 +:105AC00003D08E1E262E04D917E0142901D02029D8 +:105AD00013D104AE327001206A46082782C21060DA +:105AE000701C03A9052200F00AF80398431C0393D5 +:105AF000284621463246FFF757FF15B0F0BDF0B5F6 +:105B000087B00493019105461046012383405C1E33 +:105B100000270E9900910D9902910C9A002A3E4699 +:105B200027D04142059100263746029976188F40CA +:105B300004990B781F43491C0491521E039286421C +:105B4000069712DB01990B68024620465C1C0C602C +:105B5000059CA4192F46069DE540044610462540A5 +:105B6000FD543D46361A8642EDDA039A002A069F16 +:105B7000DBD1009900290CD0002E13D001990B68BD +:105B8000024620465C1C0C60911B8F400740EF547E +:105B900008E0811B8F40274000210298864202DAEC +:105BA000002F00D10121084607B0F0BD01DF70478A +:105BB00080B584B00190034801A9FFF7F7FF04B056 +:105BC00080BDC0463701006080B582B0024869469A +:105BD000FFF7ECFF02B080BD3C02006080B586B0EC +:105BE000019002910392034801A9FFF7DFFF06B07D +:105BF00080BDC0467F03006080B584B000900191F5 +:105C000003486946FFF7D2FF019804B080BDC04643 +:105C10002C05006080B588B000900191029203933A +:105C20000A9804900B98059003486946FFF7BEFF59 +:105C3000019808B080BDC0463B07006080B584B0C5 +:105C40000190034801A9FFF7B1FF029804B080BD9D +:105C50007F08006080B584B00190034801A9FFF778 +:105C6000A5FF029804B080BDDB0A006080B586B055 +:105C7000009001910292039303486946FFF796FF53 +:105C8000019806B080BDC0462C0B006080B588B07E +:105C900000900191029203930A9804900B9805904A +:105CA00003486946FFF782FF019808B080BDC046EF +:105CB0002B1A006080B586B0009001910292039388 +:105CC00003486946FFF772FF019806B080BDC046E1 +:105CD000EA2E006080B586B0009001910292039395 +:105CE00003486946FFF762FF019806B080BDC046D1 +:105CF0002E2F006080B58AB000900191029203932C +:105D00000C9804900D9805900E9806900F980790A7 +:105D100003486946FFF74AFF01980AB080BDC046B4 +:105D2000F338006080B586B0019002910392044878 +:105D300001A9FFF73BFF029880B206B080BDC046C4 +:105D40006E92006080B582B003486946FFF72EFF6F +:105D50000198C0B202B080BD4F9F006080B588B08E +:105D600001900291039204930A980590024801A9B8 +:105D7000FFF71CFF08B080BDBA53006080B584B047 +:105D80000090019103486946FFF710FF019804B0A5 +:105D900080BDC046FCA8006080B582B0034869465B +:105DA000FFF704FF0198C0B202B080BD3CA00060C4 +:105DB00080B584B00190034801A9FFF7F7FE02986F +:105DC00004B080BD5864006080B582B00248694666 +:105DD000FFF7ECFE02B080BD8D68006080B582B038 +:105DE00003486946FFF7E2FE019802B080BDC04655 +:105DF0006E6A006080B586B00190029103920348FC +:105E000001A9FFF7D3FE029806B080BDD4740060EC +:105E100080B584B00190034801A9FFF7C7FE04B024 +:105E200080BDC046BE9A006080B584B000900191EC +:105E300002486946FFF7BAFE04B080BD8183006066 +:105E400080B582B003486946FFF7B0FE019802B002 +:105E500080BDC046BB84006080B586B001900291D1 +:105E60000392044801A9FFF7A1FE029880B206B090 +:105E700080BDC046E485006080B582B003486946B5 +:105E8000FFF794FE019802B080BDC046B187006064 +:105E900080B584B00190034801A9FFF787FE0298FE +:105EA00004B080BD7588006080B584B0019004485E +:105EB00001A9FFF77BFE0298C0B204B080BDC046C6 +:105EC0008B9C0060F0B585B03A4A1278002A03D066 +:105ED00083213A4A7A440BE00A9A452A03D883215F +:105EE000374A7A4404E0072907D18321354A7A44A6 +:105EF000022300F0B5FC05B0F0BD019202904020F5 +:105F00000393185C0490002822D004980528039D70 +:105F100008D1284641302C4979440522FEF7E4FD9A +:105F2000002833D041350027284E7E44049C0321AD +:105F3000384602F00FFB0221C9434143705C2978C7 +:105F400041402970641E761C6D1C7F1C002CEED114 +:105F500045200399085C4630019A904210D14131A6 +:105F60001548049C2246FEF7A0FD072011498871C0 +:105F70004C80092008700121029800F05DFCBAE70E +:105F80008321134A7A4402230298B2E70A4D03227E +:105F90002A70681C0F497944FEF787FD281D0E49B9 +:105FA00079440422FEF781FD2878431D832102985D +:105FB0002A469EE73C210020E81F002029370000E8 +:105FC0001D37000013370000EB360000DF360000FD +:105FD0008E360000733600006D360000F0B581B0DB +:105FE0001D460E460446284600F016FC00280ED03A +:105FF0002068C11C090A6A469170811C090C517005 +:10600000411C090E1170001D2060D07004E068462C +:1060100004222946FEF749FD174F0822384631462B +:10602000FEF743FD3846083069460422FEF73DFD81 +:1060300000207873022139730121B973F873387421 +:10604000284600F0E9FB0146201D8625002906D0E0 +:1060500029467931C9B20422FEF73DFD03E06946C5 +:106060000422FEF722FD044A11232046294600F0AF +:10607000F7FB01B0F0BDC046E81F0020F0B583B0CB +:10608000029088794B791F020743887801904B78FA +:106090000E781546093DACB2A74204D0D01FD21FDE +:1060A00092B297421BD13D46002E08D083211C4A54 +:1060B0007A440223029800F0D3FB03B0F0BD022B18 +:1060C00018DC012B23D0022B1DD1A8B26A46106028 +:1060D000CB1D002202980199FFF7F4FEEDE7E4B230 +:1060E000A742E1D0D2B297420546DDD083210D4AC6 +:1060F0007A44DEE7032B0ED0C12B04D183210A4A58 +:106100007A440423D6E783210A4A7A44D1E78321DB +:10611000064A7A44CDE78321054A7A440823C9E731 +:10612000703500000F3500001C350000E934000018 +:10613000FA3400001835000080B5C1698A784B78C0 +:106140001B0213430A78812A09D0832A0CD0862A9D +:106150000ED1C91C031D0022FFF740FF80BDCA1CE1 +:10616000812100F07DFB80BDC91C1A46FFF786FF28 +:1061700080BD000070B50D460146012A11D1094CC1 +:1061800020462A46FEF791FC60194026721B002526 +:106190002946FEF7A0FC8120214632462B46FEF719 +:1061A00053FD70BDA02100200282C1600022C28286 +:1061B000827642858284C16102627047F0B583B005 +:1061C0000D4604462A20215C20462A3001294AD067 +:1061D00000293BD12B210022625423462B33202758 +:1061E000E15DC91EC9B22646203601293ED8218B61 +:1061F000E28A91423CD94020012D00D038460290DD +:10620000A07E03230126002800D033460027012D5D +:106210003E4600D12E46B60033431E46029B9B1BD2 +:10622000891A1A46914200DC0A4691190291012D01 +:1062300008D1211D2A48042701923A46FEF735FC71 +:10624000019AA07E002820D0FF302BE02521615C40 +:10625000062908D12B21625C0023635423462B338B +:10626000002A03D1BBE72B200021215403B0F0BD4D +:10627000FCD10021A176E18219700170B1803160FA +:10628000E068E06115480170F0E74020205CB9B299 +:10629000134B58540120384381B2637E104F7B5416 +:1062A000471C207EB9B20E4B5854E169002907D033 +:1062B0001746BAB29819E38AC918FEF7F6FB3A46B0 +:1062C000E08A1018E082A07E401CA076029881B27D +:1062D00003482A46FFF74EFFC8E7C0463C2100208E +:1062E000A021002001462A200A5C0120002A10D0AB +:1062F000012A01D100200CE025200A5C0020062A9A +:1063000007D12B200A5C01200021002A01D0084679 +:1063100070477047B0B52B2101244454011D0B4D2B +:1063200004222846FEF7C1FB0020687183202871F3 +:106330000220A8716920E8717C20C043801C28726B +:10634000092128462246FFF715FFB0BDA0210020F5 +:10635000B0B52B2101244454011D084D04222846C8 +:10636000FEF7A3FB0020687188212971A87107211D +:1063700028462246FFF7FEFEB0BDC046A021002001 +:10638000F0B581B004462520205C26462536002540 +:1063900005286AD008784B781B0203438878CD78AB +:1063A0002D02054328041843237965792D021D43E6 +:1063B000A379E7793F021F433B042B43834257D124 +:1063C00008790B1D658C002D13D02423E75C234630 +:1063D0002433B8424CD1278B401C18707B1B501FB4 +:1063E000984200DB18464219628482B2208D491D12 +:1063F00023E07C25ED436D1DEFB28325B84204D127 +:106400002046FFF7A5FF01252FE08F794979090282 +:106410003943C91CA8422BD1208B8DB2A84227D169 +:1064200089B2164D24270020E055121F8A4200DB56 +:106430000A466284154019462A46FFF773FC2085F8 +:10644000218B628C01258A420FD3E18C88420FD1C7 +:1064500006203070002060842A20205C012804D1AE +:106460002046FFF757FF00203070284601B0F0BDEE +:10647000052030701020FEF74DFBC046FFFF0000E6 +:10648000F0B589B0044623722020205C26462036D1 +:1064900003280AD02A25675D25462A35002F1BD000 +:1064A0002046FFF76DFF002814D1D748062101725E +:1064B000042131707A21C9433A314022A154083075 +:1064C000E0610020A076E08201202083217A20462E +:1064D000FFF774FE09B0F0BD042809D12B20002776 +:1064E0002754A776E7822F70B7803760E068E061B5 +:1064F00008910020012B00D1184687000120394661 +:106500000143079191423BD80390012B06930492DB +:10651000059707D1201D04220899FEF7C6FA059FAA +:10652000049A069BE08A00280CD0012B24D1204637 +:106530001230211D0422FEF7D7FA059F049A069B0C +:10654000002819D0032138460843904218D80091FA +:106550000899C8190290C8570F467A21C9437A3161 +:1065600049B28525884225DDA74804210172317092 +:106570003A3540216554A2E702203843904202D9BF +:10658000A148852193E72120205C984246D13078AC +:10659000012851D1012B7FD1211D0422089803929B +:1065A000FEF7A2FA059F002876D0974806210172CF +:1065B00003997EE70195012B14D1307801281ED173 +:1065C000251D2146123104222846FEF78DFA069B2E +:1065D000002807D0029800780199491CC9B2884266 +:1065E00000D0E8E03078012809D1012B00D080E00C +:1065F000029800780199491CC9B2884279D107995B +:1066000078184078795C0F020743208AC01E8742C1 +:106610001FDD7D480099017204216DE07A20C0439E +:1066200001460831784A1172042131703A30402114 +:1066300060540832E26144E7012B56D12B2000213F +:106640002154A176E1822970B1803160E068E06177 +:1066500040E702980078812805D08628019D51D016 +:10666000832800D097E0012B57D1251D6749794435 +:10667000042228460892FEF737FA002807D064491A +:10668000794404222846FEF72FFA002845D15E48B7 +:106690000B21017208992FE0089AD119D05DA27ED2 +:1066A000904222D10498079A851AE08A228B121A06 +:1066B000954200DB1546AFB2E2691018491C3A4614 +:1066C000FEF7F3F90699012908D1E08AE169091872 +:1066D000E08C3A46FFF726FB0699E084E08A28180A +:1066E000E082A07E401CA0763CE047480421017275 +:1066F000DFE64548042101723170019A3A324021A7 +:106700006254DCE6012B6AD1201D424979440425FC +:106710002A46FEF7E9F9002870D004980599451A31 +:10672000FF1CBD4200DB3D46AAB2E0690299089217 +:10673000FEF7BBF9069B012B06D1E1690020089A00 +:10674000FFF7F0FA069BE084212023542783E5829B +:106750000020A07620461230211D04221D46FEF79F +:10676000A4F92946E08A012901D1218B06E0218B79 +:10677000CA1C824202D22448032198E6884204D2ED +:106780000020606301203070A4E6022030702046B3 +:10679000FFF7D2FC9EE61C48039B03720421317074 +:1067A000019A3A32402162540830E0610020A0761C +:1067B000E08223838AE6144C042220462946FEF711 +:1067C00074F90020607101983A302071039AA27127 +:1067D0000620E07108212046FFF7CCFC7AE60A4843 +:1067E000039A0272042131703A3540216554083011 +:1067F000E0610020A076E082228367E602480B2158 +:106800000172357079E7C046A0210020B62F000044 +:10681000A82F00001C2F000080B5064979440422EF +:10682000FEF762F9014601200022002900D010463F +:1068300080BDC046082E000080B52A22835C024637 +:106840002A32002906D0002B08D101211170FFF750 +:1068500061FD80BD012B01D10220107080BD0000C0 +:1068600070B504462A20205C002809D0012824D0D5 +:106870002520205C062820D12B20205C00281CD15C +:10688000202003252554402021540020A076E261D9 +:10689000E08223832120215C2546213503290DD167 +:1068A000084E3078002808D0032100E029782046DF +:1068B000FFF784FC30780028F8D170BD2046FFF740 +:1068C0007DFC70BD3C210020024900200860024987 +:1068D00008607047F8210020F421002010B5074817 +:1068E000002444704F210170012181700221C17088 +:1068F0000421FFF799FA204610BDC046241E00204F +:1069000070B582B06D4600246C704F262E70022048 +:10691000A8700320E8702C7105212846FFF784FA3F +:106920006C702E700120A870E87004212846FFF7D3 +:106930007BFA204602B070BD10B582B001A80024D9 +:1069400044704F210170012181700221C170042126 +:10695000FFF76AFA204602B010BD0000B0B582B061 +:10696000144800240460144804606D464F202870C9 +:106970006C700520A8700420E870012028716971EE +:10698000AC71012A05DC002A0AD0012A0AD10420B0 +:1069900006E0022A03D0032A04D1022000E00320EB +:1069A000694688716846C3710821FFF73DFA0020E7 +:1069B00002B0B0BDF8210020F421002010B582B053 +:1069C0006846002444704F2202700522827004221F +:1069D000C2700122027141718471C4710821FFF7F4 +:1069E00023FA204602B010BDB0B582B00D4668460D +:1069F000002444705021017003218170C570402132 +:106A0000017144710621FFF70FFA8020054201D081 +:106A1000074800E0054801687F2215400122AA408E +:106A20000A430260204602B0B0BDC046F8210020F3 +:106A3000F421002070B582B00D46684600244470F1 +:106A40005021017003218170C57080260671447148 +:106A50000621FFF7E9F9354201D0074800E0054873 +:106A600001687F2215400122AA409143016020461F +:106A700002B070BDF8210020F421002080200142E6 +:106A800001D0064800E0044802787F200140012040 +:106A9000884010407047C046F8210020F4210020B3 +:106AA00010B582B06846002444704F220270022262 +:106AB00082700322C27001710521FFF7B5F92046EB +:106AC00002B010BDB0B582B01C46154668465022D3 +:106AD0000270C170202101714471E11C8170090AAA +:106AE00041700621FFF7A0F928462146FFF79CF9DF +:106AF000002002B0B0BD10B582B0684600244470DA +:106B00005023037003238370C170302101714271DF +:106B10000621FFF789F9204602B010BD70B5154671 +:106B20000E4604460220002C0FD0D421204601F04E +:106B300087FE002E01D0B02026509C200121215438 +:106B400025702046FFF7C0FE0020C0B270BDB0B572 +:106B500004469C2001212154B4256059002806D008 +:106B60004068FEF7DBFE0246217920469047083553 +:106B7000CC2DF2D12046FFF7DFFE2046FFF7AEFE18 +:106B80000020B0BD0223002A07D00023022804D829 +:106B9000C0000818B42142500023D8B2704780B515 +:106BA000FFF7AEFE002080BDF0B581B00C46054673 +:106BB0000026B4272846314600F066F9002807D0A1 +:106BC000E8590068FEF7AAFE02462846214690478B +:106BD0000837761C032EEDD1002001B0F0BDF0B5D2 +:106BE00081B00C4605460026B4272846314600F001 +:106BF0004BF9002807D0E8594068FEF78FFE02469F +:106C00002846214690470837761C032EEDD10020F8 +:106C100001B0F0BDB0B504462546A835284600F0C1 +:106C200077FB942001212150AE20205A98216050FA +:106C3000A820215C1F200840022808D001280BD082 +:106C400000280ED12046294600F02BF90EE0204600 +:106C5000294600F0D8FA09E02046294600F0AFFAAC +:106C600004E0802001402046FFF7BEFE0020B0BDBA +:106C7000F0B583B002920446019100291CD025464C +:106C80009C350027B4262046394600F0FDF8002840 +:106C90000DD0A0598069002809D02978032906D190 +:106CA000FEF73CFE034620460199029A98470836B3 +:106CB0007F1C032FE7D12FE09420205803282BD1ED +:106CC000E16D206E81420AD9091AE165814200D343 +:106CD00001468AB22046029900F0C7FD1CE0264614 +:106CE0009C360025B4272046294600F0CDF8002820 +:106CF0000BD0E0590069002807D03178032904D16E +:106D0000FEF70CFE01462046884708376D1C032D10 +:106D1000E9D1204600F0B0FD002003B0F0BDF0B591 +:106D200081B00446009100291BD027469C370026DD +:106D3000B4252046314600F0A7F800280CD0605951 +:106D40004069002808D03978032905D1FEF7E6FD0F +:106D500002462046009990470835761C032EE8D15C +:106D60004DE094202058022842D1E069266AB042C2 +:106D70000AD9D022A1588919A150801BE06182B2A2 +:106D8000204600F064FD33E0A5692846314601F055 +:106D900067FCB5420FD300290DD198202058264614 +:106DA0009836854207D20025204629462A4600F01B +:106DB0004EFD35601CE026469C360025B427204653 +:106DC000294600F061F800280BD0E059C06800287F +:106DD00007D03178032904D1FEF7A0FD01462046F3 +:106DE000884708376D1C032DE9D1204600F050FD7F +:106DF000A020205CA034012801D1002020700020B8 +:106E000001B0F0BD70B504469C2001212154402002 +:106E1000206220660025B4262046294600F034F87A +:106E2000002807D0A0594068FEF778FD0246217976 +:106E30002046904708366D1C032DEDD1002070BD13 +:106E4000017400207047002070470020704770B523 +:106E500004469C20205C032814D10025B42620463B +:106E6000294600F011F8002808D0A059C069002870 +:106E700004D0FEF753FD01462046884708366D1CB6 +:106E8000032DECD1002070BD02460020022907D856 +:106E9000C8001018B42141580120002900D108462B +:106EA000704780B54A78042A08DD072A0FDC052AD6 +:106EB00014D0062A1BD100F021F81DE0002A10D0C2 +:106EC000012A17D0032A12D100F034F914E0082A5D +:106ED0000AD0092A0BD100F0BDF80DE000F094F8BB +:106EE0000AE000F005F907E000F0EBF804E000F03C +:106EF000E3FB01E000F03BF9002080BDB0B582B0BB +:106F00000D46044601A8002101806A88100A052860 +:106F100012DC01281CD0022824D0032837D1D0B29B +:106F2000022839DC00285FD0012865D002282ED144 +:106F3000B0202058C0680EE006281CD0072823D0B7 +:106F40000F2824D1B0202058C069002803D11EE0AA +:106F5000B02020580068FEF7E1FC0246207C01A921 +:106F600090472FE0B420205800282CD0217C002905 +:106F700022D0C06A21E0207C002808D1B42020580B +:106F8000002804D0406B18E0207C00280ED020465A +:106F9000294600F091FB25E0032829D004282FD0B2 +:106FA0000528F4D1B02020588069D4E7B4202058B7 +:106FB0000028ECD0006B00E0806AFEF7AFFC0146D1 +:106FC00001A88847014601A80288002A0AD0E8885B +:106FD000002807D0824200D3024601A80280204642 +:106FE00000F020FC02B0B0BDB02020584068B2E7ED +:106FF000B02020580069AEE7B02020588068AAE78A +:10700000B02020584069A6E770B50446888800285B +:107010000BD1C888002808D148887F2606409C20CC +:10702000205C25469C35032803D1204600F044FB14 +:1070300070BD9E202654F1B22046FFF731FD204658 +:1070400000F01AFC002E02D00220287070BD012032 +:10705000287070BD70B50D460446AE78022E1DD264 +:107060009C20215C20469C30032907D0022915D1A1 +:10707000002E22D066600321017009E0002E12D09C +:107080006068B04219D0C1B22046FFF7A8FD666023 +:1070900020463146FFF788FD02280ED120462946BA +:1070A00000F00AFB70BD0221017066602046314687 +:1070B000FFF795FD204600F0DFFB204600F0DCFBEB +:1070C00070BD80B5CA88012A0AD19C22825C032A3D +:1070D00009D0022A04D1002181600146083103E071 +:1070E00000F0EAFA80BD011D012200F09BFB80BD8B +:1070F000B0B504469C20205CFE220240022A15D135 +:107100000120E060A420215825460C3503200029E9 +:1071100005D0204600F0BCFBE16802200843E06097 +:1071200002222046294600F07DFBB0BD204600F03B +:10713000C3FAB0BDB0B50D4604466888012815D124 +:10714000A42001212150287902280CD8C000201841 +:10715000B4214058002806D08068FEF7DFFB0246C5 +:10716000204629469047204600F086FBB0BDB0B5CA +:107170000D4604469C20205CFE210140022919D1C5 +:10718000688801281AD1A4200021215028790228DA +:107190000CD8C0002018B4214058002806D08068C0 +:1071A000FEF7BCFB0246204629469047204600F0E9 +:1071B00063FBB0BD2046294600F07EFAB0BDB0B5F5 +:1071C0000D4604469C20205C032816D1287902280D +:1071D00013D8C0002018B421405800280DD0806872 +:1071E000FEF79CFB0246204629469047E888002887 +:1071F00007D1204600F040FB03E02046294600F07E +:107200005BFA0020B0BDB0B50D4604462878602278 +:1072100002402979202A0FD102290DD8C800201850 +:10722000B4228058002807D08068FEF777FB02461A +:1072300020462946904769E06878002816D0012842 +:107240001DD0032862D19C20205C03281BD16888B4 +:10725000002807D180200843802803D02046FFF76C +:10726000C3FB297902294ED8C80040E09C20205C4D +:10727000032817D0022810D148060AD146E09C20E6 +:10728000205C032827D0022807D1802008438028CB +:107290003CD02046FFF7A8FB38E02046294600F006 +:1072A0000BFA33E07F2008400001201805465435D2 +:1072B00014308022114200D005462046FFF7DEFB45 +:1072C0000121002800D101462960022220462946DA +:1072D00000F0A8FA1AE06888002817D1480612D0F2 +:1072E0002046FFF7A7FB287902280CD8C0002018F9 +:1072F000B4214058002806D08068FEF70FFB0246F4 +:10730000204629469047204600F0B6FA0020B0BD3E +:107310000A7802704A7842708A78CB781B0213434D +:1073200043800A794B791B02134383808A79C97998 +:1073300009021143C180704710B504468021FFF750 +:1073400053FB00212046FFF74FFB10BD70B582B004 +:107350000D46044601A900200880694608702A7875 +:1073600060211140002910D0202938D169780A46BF +:107370000A3A022A33D302291BD0032919D0204606 +:10738000294600F099F9022029E069780B2913D0E9 +:107390000A290ED0062922D16888000A0022212855 +:1073A0000ED02228114616D101AE304600F058F812 +:1073B0000AE0694601220EE0204600F05DFA0DE089 +:1073C00001AE304600F032F801463288E888824249 +:1073D00000D302463280204600F024FA0020C0B2DA +:1073E00002B070BDF0B581B004468221032640256D +:1073F00032462B46FFF7B2FA02272046394632467C +:107400002B46FFF7ABFA204639462A46FFF773FBB7 +:10741000002001B0F0BD10B504468221FFF7CEFA7E +:1074200002212046FFF7CAFA002010BDAC21094A0C +:10743000515C0922012905D0002906D10749794468 +:10744000092204E00449794401E000221146028047 +:1074500008467047FC210020E6210000FA210000C8 +:10746000F0B581B00446AC201349085C2221002805 +:1074700019D001281AD110488121032740263A4605 +:107480003346FFF76BFA01250B4829463A46334647 +:10749000FFF764FA084829463246FFF72CFB0848F4 +:1074A0007844222104E00548784401E000210846A0 +:1074B000218001B0F0BDC046FC210020BB210000AE +:1074C000A1210000F0B581B00446812103264025AA +:1074D00032462B46FFF742FA01272046394632460C +:1074E0002B46FFF73BFA204639462A46FFF703FBB7 +:1074F000002001B0F0BD000080B5012903D1034890 +:107500000121FEF75BFE002080BDC0465C2100200B +:10751000B0B5144601290DD1012540222946FFF7B7 +:10752000EAFA2846FDF750FB0246034821462B465F +:10753000FEF7A6FF0020B0BD5C21002080B5022927 +:1075400003D103487844FDF79FFF002080BDC0466B +:1075500051D7FFFFB0B51446022919D102214022AC +:10756000FFF7C9FA0B4DA879002811D10220FDF7C9 +:107570002BFB0246094878442146FDF7CBFE022842 +:1075800006D1072028700120A87103480068688090 +:107590000020B0BD3C210020E42100201FD7FFFFC8 +:1075A00070B504468321032540262A463346FFF75B +:1075B000D5F9204629462A463346FFF7CFF920461B +:1075C00029463246FFF797FA002070BD0020704729 +:1075D0000020704780B5032903D103487844FDF7A4 +:1075E00053FF002080BDC046C9D6FFFFB0B514468A +:1075F000032919D103214022FFF77DFA0B4DA87909 +:10760000002811D10320FDF7DFFA0246094878442B +:107610002146FDF77FFE022806D10B2028700520A9 +:10762000A8710348006868800020B0BD3C2100209C +:10763000E421002097D6FFFF1220088001487844FB +:107640007047C046CA2200000420088001487844E0 +:107650007047C046CC2200000E20088001487844C4 +:107660007047C046C02200000E20088001487844C0 +:107670007047C046BE2200000A20088001487844B6 +:107680007047C046BC2200000E20088001487844A4 +:107690007047C0469E2200000E20088001487844B2 +:1076A0007047C0468E220000392008800148784487 +:1076B0007047C046D71F000080B50A7852B2002A32 +:1076C00002DBFFF739FE80BD4A78772A0FD0062A01 +:1076D000F7D14A88194B9A42F3D1CA881221122A4B +:1076E00000D30A461649794400F09CF880BD8A8888 +:1076F000042A09D1CA882821282A00D30A46114918 +:10770000794400F08FF880BD8A88052A09D1CA889B +:107710009221922A00D30A460B49794400F082F85C +:1077200080BD8A88072ACCD1CA88B221B22A00D368 +:107730000A460649794400F075F880BDEE03000062 +:10774000FA1F0000F21F0000002000007820000057 +:1077500070B5044623480025D4222946FDF7BBF91D +:10776000214E30460C3004222946FDF7B4F910367C +:10777000082230462946FDF7AEF9002C2DD0194CD1 +:107780000025D42220462946FDF7A5F91949794458 +:1077900020462A46FFF7C2F9174A7A44284621466E +:1077A000FFF7F0F90120154A7A442146FFF7EAF97C +:1077B000FF2252320D480E49FEF7F6FC0220104A15 +:1077C0007A442146FFF7DEF9032140222046FFF7E5 +:1077D00092F92046FFF7E3F970BD0248FFF7B7F9C9 +:1077E00070BDC046FC2100203C2100205C2100200F +:1077F000E81F0020321F0000C6200000F02000001B +:107800001021000060210180014878447047C04683 +:107810003A2100000A210180014878447047C0469F +:107820008A210000B0B50C46942102234350D02198 +:1078300044508261C261016A914200D80A4693B203 +:10784000002529462246FFF73DF92846B0BDB0B5D0 +:107850000C46016A914200D80A4693B20025294697 +:107860002246FFF72FF92846B0BD10B50024214667 +:10787000FFF741F9204610BD10B594210422425073 +:107880000024214622462346FFF71CF9204610BD5E +:1078900010B5942105224250002421462246FFF7CC +:1078A0002AF9204610BD0000B0B512490A7801201F +:1078B000012A1DD8521E0C235343CB181A8B002AC1 +:1078C00016D01969002913D09B8A002B06D1940089 +:1078D0000C190325ED436459E41C09D1934206D2E7 +:1078E0009A0089180322D2438958891C00D00020AD +:1078F000B0BDC046241D002010B50E490A780120F5 +:10790000012A16D8521E0C235343CB181A8B002A77 +:107910000FD0196900290CD09B8A541E9C4208DDA7 +:10792000921E9A4204DD9A0089184968891C00D089 +:10793000002010BD241D00200848017800290AD02D +:107940000C224A4380184189028901208A4203D8C7 +:10795000FF208A4200D3002040B27047241D00203F +:10796000F0B581B00146164A1078012826D8401E8D +:107970000C234343D218168B002E1FD01569002DFF +:107980001CD0022E1AD3948A13461433771EA742B2 +:1079900014DDB61EA6420ADBA600AD196D68AE1C4A +:1079A0000CD0ED1C03D100211980D18204E0D482D7 +:1079B000621C1A80002901D000F03EF801B0F0BD31 +:1079C000241D002080B50120FFF7CAFF80BD000004 +:1079D000B0B517490878012829D8401E0C22424327 +:1079E00089180A8B002A22D00C69002C1FD0022A89 +:1079F0001DD38D8A0B461433002D0AD0AA00A2187D +:107A00000324E4431259921C11D0CD82691E1980BF +:107A10000BE0950064190325ED436459E41C06D17D +:107A2000044C14191C80521ECA8200F005F8B0BD27 +:107A3000241D0020FEFF0000F0B581B004460C209C +:107A400060431A490E183069B18A89004058374698 +:107A5000143710360321C943884224D8FDF75EFF4E +:107A600031683A889200895805680846FDF756FF44 +:107A7000002D06D00068FDF751FF014620468847DB +:107A800011E08068FDF74AFF0546306839888900B3 +:107A90004058FDF743FF4068FDF740FF024620468F +:107AA000294600F061F801B0F0BDC046241D002059 +:107AB000F0B581B02B4D2878012825D8401E0C2622 +:107AC00070432A18108B00281ED0116900291BD082 +:107AD000928A824218D290000858FDF71FFF8068F2 +:107AE00029784C1E6643002810D0A8190169808AA5 +:107AF00080000858FDF712FF8068FDF70FFF014670 +:107B00000022204600F030F801B0F0BDA819038B28 +:107B1000002BF9D0828A014614319B1E9342F3DB7D +:107B200005699600AE1900967768FE1C13D0BE1C3E +:107B3000EAD1009E7668B61C09D1521C96B2B342B7 +:107B400004DBB600AE197668B61CF6D00A80C28295 +:107B5000501C088002E000220A80C2822046FFF703 +:107B60006BFFD1E7241D0020F0B583B001920C46D5 +:107B70000C221146029041431F4B5F1800213983AC +:107B800039617961181DFCF7A6FF20463C46103488 +:107B90003D4618353E461636143700282AD0FDF7E4 +:107BA000BDFE206029888A008258521C06D0491CDC +:107BB0008AB292008258521CF9D12980019800287B +:107BC00015D0FDF7ABFE054620683988890040587E +:107BD0000BE0FDF7A3FEA84209D038883080401C96 +:107BE000388080B2800021680858411CF1D1029889 +:107BF000FFF722FF03B0F0BD241D002080B50A4925 +:107C0000884208D00949884208D00949884208D1E9 +:107C1000FFF7DEFE05E0FFF74BFF02E00120FFF774 +:107C20009FFE002080BDC04603000080020000804F +:107C30000100008010B50146002000290FD1084C3A +:107C4000218BA28A8A420AD22069FDF767FEA18AA7 +:107C500089004058FDF762FE4068FDF75FFE10BDE9 +:107C6000241D002080B503480078401EFFF7E2FF86 +:107C700080BDC046241D002010B5044600F00CFC59 +:107C80002420604308490818C42105224254C02119 +:107C9000064A7A444250BD2101224254D021044A6E +:107CA0007A44425010BDC046241D00201E1D000015 +:107CB00059FFFFFF80B500F0FFFA9D22002806D093 +:107CC00003498A5C112A02D1B422024B8B5280BD37 +:107CD000241D00200A80000010B50446FFF7CCFFE9 +:107CE0002420604304490818CC21044A7A444250B5 +:107CF000204600F0A7FB10BD241D0020C5FFFFFF9C +:107D000080B500F0D9FA9D22002806D003498A5C8C +:107D1000102A02D3B422024B8B5280BD241D0020B6 +:107D20000A80000010B50446FFF7A6FF2420604338 +:107D300004490818CC21044A7A444250204600F0F5 +:107D400081FB10BD241D0020C5FFFFFF70B5054657 +:107D5000FFF788FF0446114E30469C30202229460A +:107D6000FCF7A3FE68780146103905290AD29D2048 +:107D7000305C0F21014088002058B82170509C369B +:107D8000304670BD022803D00128F8D1616800E0B8 +:107D9000E16800200029F2D1F3E7C046241D00204D +:107DA00010B5044600F078FB242060430B49081806 +:107DB000C42106224254C021094A7A444250BD21BE +:107DC00001224254CC21074A7A444250D021064A2B +:107DD0007A444250204600F035FB10BD241D00209F +:107DE000961C000081FFFFFF29FEFFFFF0B587B062 +:107DF0000E46FFF71FFF06904B4C20460C30002527 +:107E0000022729463A46FCF766FE20460E300595C5 +:107E100029463A46FCF75FFE701C049002D0A06829 +:107E200000287DD006984068FDF778FD054600F0F3 +:107E300065FE291801220592012871DB6068059012 +:107E4000A068029000200390069001952B468B427B +:107E5000039C1A4620D200201A46044626469D1945 +:107E6000C01D741C722813D82F781F2F04DD202FFB +:107E700009D02D2F07D003E0092F04D00A2F09D0F5 +:107E80005F2F00D015462A461D198D42E6D303E028 +:107E9000344601E09A19741C1819884224D2002C27 +:107EA000069D22D09A4220D00025ED43455D2C2D21 +:107EB00006DC2E46093E022E16D3202D14D003E0F8 +:107EC0002D2D11D05F2D0FD000782C2805DC054614 +:107ED000093D022D08D3202802E02D2804D05F2878 +:107EE000069D02D0D41A00E0069D0498002806D012 +:107EF0000598A84203D10598029A90420AD31B190B +:107F0000681C8B4200D328468B4206909FD3401CAE +:107F1000059005E004480146CC810198181A888133 +:107F2000059807B0F0BDC046241D0020B0B504463A +:107F3000FFF7A2FE094D69682046FFF757FF24208E +:107F400060432818CC21064A7A444250D021054A81 +:107F50007A444250204600F075FAB0BD241D00203E +:107F60001D00000015010000F0B583B00546FFF7C5 +:107F700079FE0446374E30469C3020222946FCF7D5 +:107F800094FD6878102816DC012833D002283BD0F5 +:107F900010285AD12068002841D0B468FDF7BEFCF3 +:107FA00003467068B1686A46401C03C2012C41D880 +:107FB0002A4A7A4440E001461139032945D20F216B +:107FC0000840401E40003718FD89002D3DD06068F4 +:107FD000FDF7A4FCB98940186946086034461C3492 +:107FE0008021204A7A4420462B46FDF7C3FAB82068 +:107FF00034502AE0FFF758FC01460020002924D025 +:108000007168002923D020E0FFF776FC00281CD0FF +:108010007168B068421E0020914216D117E0716865 +:10802000B0686A46106030461C304B1C80210C4AF8 +:108030007A4404E0084A7A4430461C308021FDF737 +:1080400099FA30461C30B82170509C36304603B047 +:10805000F0BDC046241D0020DA1A0000FA1100000D +:10806000EB1A00003D1B000080B5174988420BD079 +:108070001649884213D01649884222D115484168D2 +:1080800000291CD0491E14E012498868002803D03A +:108090004968401E884214D1FFF70AFD11E00D48DF +:1080A00041688268521E914202D1FFF78BFC08E0C2 +:1080B000491C41600078401EFFF738FF01E0FFF7E0 +:1080C00087FC002080BDC0460300008002000080C5 +:1080D00001000080241D002070B50446FFF72CFC31 +:1080E00001280BD0401C0FD11C4E301D00250C2246 +:1080F0002946FCF7F0FCE843706005E01748001DD6 +:1081000000210C22FCF7E7FC204600F0C5F92046D0 +:10811000FFF790FD4068002819D00020C143204699 +:10812000FFF764FE0D4DA860002807D1281D00212F +:108130000C22FCF7D0FCA868002804D0401E696817 +:10814000814200D968602046FFF7F0FE70BD034809 +:10815000001D00210C22FCF7BEFC70BD241D002078 +:1081600070B50546FFF77EFD0446124E30469C3042 +:1081700020222946FCF799FC68780F2806DC0128A4 +:108180000AD0022812D1FFF7B7FB07E010280AD067 +:1081900011280BD1606807E0FFF786FB014600203D +:1081A000002903D070BD2068B82170509C3630463D +:1081B00070BDC046241D002010B5044600F06CF9C7 +:1081C000242060430B490818C42105224254C021D1 +:1081D000094A7A444250BD2101224254CC21074A27 +:1081E0007A444250D021064A7A444250204600F058 +:1081F00029F910BD241D0020561900007DFFFFFF46 +:1082000011FAFFFF70B50546FFF72CFD0446164E28 +:1082100030469C3020222946FCF747FC68780F281E +:1082200007DC012812D0022813D00F2818D12068AB +:1082300009E01038022813D29D20305C0F21014044 +:10824000880020184068B821705009E0FFF72CFB27 +:1082500001E0FFF751FB01460020002900D070BD6E +:108260009C36304670BDC046241D002010B5044623 +:1082700000F012F9242060430B490818C42106229B +:108280004254C021094A7A444250BD21012242543D +:10829000D021074A7A444250CC21064A7A444250BF +:1082A000204600F0CFF810BD241D00204219000028 +:1082B00065F9FFFF65FFFFFF70B50546FFF7D2FCCC +:1082C0000446124E30469C3020222946FCF7EDFB36 +:1082D0006878022804D0012809D1FFF7E5FA01E007 +:1082E000FFF70AFB0146002000290BD070BD9D203E +:1082F000305CF021084205D00F2108408000205852 +:10830000B82170509C36304670BDC046241D0020F8 +:10831000B0B51749884211D01649884215D0164980 +:10832000884222D1F820154C2158E0256059401E82 +:108330008847002819D06059401E11E0E0200F49FD +:108340000858FC22895888470FE0F8200B4C215828 +:10835000E0256059401C8847002806D06059401C21 +:1083600060512078401E00F00BF80020B0BDC046E0 +:10837000030000800200008001000080241D002016 +:10838000F0B581B004460120C6430C4D2F46E437BA +:10839000F8202958E02028583018884701C7761C53 +:1083A000032EF5D12046FFF7FBFC2420604328185C +:1083B000D021034A7A44425001B0F0BD241D002070 +:1083C00059FFFFFFB0B50446F8200B4D2950E020BF +:1083D0002B50FC202A502046FFF72CFCE435A84205 +:1083E00006D00649794400222046FFF7BDFBB0BD08 +:1083F0002046FFF7C5FFB0BD241D0020B4180000C3 +:1084000080B50023FFF7DEFF80BD0000B0B50C4D46 +:108410002878002811D12846BC3000242422214687 +:10842000FCF759FB28780C225043281810302146BD +:10843000FCF751FB2878401C2870C0B2401EB0BD2C +:10844000241D0020B0B5044612480278002A0ED040 +:10845000611C91420BD1242161434518FCF7AEFC0D +:10846000BE2000212952204600F02AF8B0BD01218B +:108470000023002A0A4600D01A46641C00D0194680 +:108480001143012904D14178AA2901D16921417000 +:10849000B0BDC046241D002070B5242460430749A8 +:1084A0000E18FCF78BFC3046BC30002529462246CE +:1084B000FCF711FBBC20355470BDC046241D0020C4 +:1084C000F0B581B004460420FDF7EEFC00283CD056 +:1084D00097283AD0242060431D490C18C02020580A +:1084E0002546C0352646BE3600282ED02046CC3044 +:1084F0000090C4343088AA27217880B2884224D2E0 +:10850000FDF79EFC002820D1FDF71CFCB84203D1EA +:10851000FDF742FCB84218D128683188490140185B +:1085200000990968002902D08847002807D001284F +:1085300003D12868318849014018FBF7A2FB308835 +:10854000401C308029680029D6D101B0F0BDC0465A +:10855000241D0020002243088B4274D303098B4260 +:108560005FD3030A8B4244D3030B8B4228D3030C03 +:108570008B420DD3FF22090212BA030C8B4202D3A5 +:108580001212090265D0030B8B4219D300E0090ACD +:10859000C30B8B4201D3CB03C01A5241830B8B42D6 +:1085A00001D38B03C01A5241430B8B4201D34B03BF +:1085B000C01A5241030B8B4201D30B03C01A524124 +:1085C000C30A8B4201D3CB02C01A5241830A8B42A9 +:1085D00001D38B02C01A5241430A8B4201D34B0292 +:1085E000C01A5241030A8B4201D30B02C01A5241F6 +:1085F000CDD2C3098B4201D3CB01C01A52418309AA +:108600008B4201D38B01C01A524143098B4201D3E3 +:108610004B01C01A524103098B4201D30B01C01A0E +:108620005241C3088B4201D3CB00C01A5241830888 +:108630008B4201D38B00C01A524143088B4201D3B5 +:108640004B00C01A5241411A00D201465241104615 +:108650007047FFE701B5002000F0F0F802BDC0460A +:108660000029F7D076E7704703460B437FD40022FA +:1086700043088B4274D303098B425FD3030A8B42B6 +:1086800044D3030B8B4228D3030C8B420DD3FF2220 +:10869000090212BA030C8B4202D31212090265D0EE +:1086A000030B8B4219D300E0090AC30B8B4201D3A1 +:1086B000CB03C01A5241830B8B4201D38B03C01AE8 +:1086C0005241430B8B4201D34B03C01A5241030B5F +:1086D0008B4201D30B03C01A5241C30A8B4201D310 +:1086E000CB02C01A5241830A8B4201D38B02C01ABB +:1086F0005241430A8B4201D34B02C01A5241030A32 +:108700008B4201D30B02C01A5241CDD2C3098B4216 +:1087100001D3CB01C01A524183098B4201D38B0193 +:10872000C01A524143098B4201D34B01C01A524136 +:1087300003098B4201D30B01C01A5241C3088B427B +:1087400001D3CB00C01A524183088B4201D38B0066 +:10875000C01A524143088B4201D34B00C01A524108 +:10876000411A00D201465241104670475DE0CA0FDF +:1087700000D04942031000D34042534000229C469F +:1087800003098B422DD3030A8B4212D3FC228901A9 +:1087900012BA030A8B420CD3890192118B4208D37F +:1087A000890192118B4204D389013AD0921100E0E1 +:1087B0008909C3098B4201D3CB01C01A52418309F5 +:1087C0008B4201D38B01C01A524143098B4201D322 +:1087D0004B01C01A524103098B4201D30B01C01A4D +:1087E0005241C3088B4201D3CB00C01A52418308C7 +:1087F0008B4201D38B00C01A5241D9D243088B421D +:1088000001D34B00C01A5241411A00D201466346BF +:1088100052415B10104601D34042002B00D5494223 +:10882000704763465B1000D3404201B5002000F062 +:1088300005F802BD0029F8D016E770477047C0461A +:1088400010B5002200F00AF810BDC04610B500F0C7 +:1088500031F810BD10B500F07FF810BD0B0010B559 +:1088600011001A0000F0D4F810BDC04630B5032A3C +:108870000CD903000B439B0719D103680C68A34272 +:1088800015D1043A04300431032AF6D8551E002AC3 +:108890000BD0002303E05A1C9D4206D01300C25C9B +:1088A000CC5CA242F7D0101B00E0002030BD551E6A +:1088B000EFE7C046F0B5C64600B50F2A41D90327F9 +:1088C0000D003E0005430C0003002E402F423DD119 +:1088D0001500103D2D09AC462D01A84680442568A1 +:1088E00067681D605F60A568E7689D60DF601034A1 +:1088F0001F0010334745F2D165460F230C24013584 +:108900002D01491913404519144222D08C59AC51FC +:1089100004369C1B032CF9D80324043B9B08013329 +:108920009B002240ED18C918561E002A06D00023CD +:10893000CC5C1A00EC5401339642F9D180BCB846A5 +:10894000F0BD0500561E002AF1D1F7E70500561EBE +:10895000EDE71A00F6E7C046F0B5C64600B5884216 +:108960000CD98B18984209D2531E002A03D0CA5C36 +:10897000C254013BFBD280BCB846F0BD0F2A0BD8D5 +:108980000500561E002AF6D00023CC5C1A00EC54D9 +:1089900001339642F9D1EEE703270D003E0005436F +:1089A0000C0003002E402F422CD11500103D2D0944 +:1089B000AC462D01A846804425681F001D606568EF +:1089C0005D60A5689D60E5681034DD601033474543 +:1089D000F2D165460F230C2401352D0149191340AE +:1089E0004519144211D08C59AC5104369C1B032CF0 +:1089F000F9D80324043B9B0801339B00ED18C918E8 +:108A00002240BEE70500561EBEE71A00B9E7C04681 +:108A1000F0B5050083074AD0541E002A44D0030055 +:108A20000322CEB202E00135013C3DD301332E706A +:108A30001342F8D1032C2FD9FF220A401502154307 +:108A40002A0415430F2C35D92700103F3F093E015A +:108A5000B4461E001A0010366644156055609560D5 +:108A6000D5601032B242F8D10F260C2201373F01F7 +:108A70002640DB193700224217D03E1FB608B4004B +:108A8000A4461A001C1D644420C2A242FCD1032447 +:108A90000136B6009B193C40002C05D0C9B21C1908 +:108AA000197001339C42FBD1F0BD3400F4E714008F +:108AB0000300BFE72700E0E7F0C041464A465346BF +:108AC0005C466D4676467EC02838F0C80020704768 +:108AD00010307CC890469946A246AB46B54608C8B9 +:108AE0002838F0C8081C00D10120184703000A7874 +:108AF00001311A700133002AF9D1704710B583078C +:108B00000AD00300032102E001330B4205D01A789A +:108B1000002AF9D1181A10BD030019680C4A0D4C2F +:108B20008A188A4322420FD15968094A04338A18A5 +:108B30008A43224208D15968054A04338A188A4375 +:108B40002242F1D000E001331A78002AFBD1E1E79C +:108B5000FFFEFEFE8080808030B5002A28D0030012 +:108B60000B439B0713D1032A11D9134D0BE0043A91 +:108B7000002A1DD0114C1C199C432C4218D10430E2 +:108B80000431032A03D903680C68A342EFD00478A8 +:108B90000D78A5420ED1012A0AD0012306E0C45C5B +:108BA000CD5CAC4206D101339A4201D0002CF6D103 +:108BB000002030BD601BFCE780808080FFFEFEFE51 +:108BC000F0B50C00044303000600A40712D1032AE9 +:108BD00010D9144CA44666460D68134C1F002C197E +:108BE000AC4334421CD10433043A1E0004313D60CE +:108BF000032AF0D80024B71806E00D5D013A355578 +:108C0000BB1A0134002D02D0002AF6D1F0BD00219C +:108C1000D418002AFAD0197001339C42FBD1F5E731 +:108C20001E00E7E780808080FFFEFEFE30B5050075 +:108C300008002B006C18002903D106E001339C4288 +:108C400003D01A78002AF9D1581B30BD2530385886 +:108C5000001976A91488AC17A914873DA914872098 +:108C60009EC9845ACB02FAB24E1C0368B3B517C131 +:108C7000A4488FBA97F0E3459AC053EA0100000078 +:108C800003C01F02B41600142200203F76A91488E6 +:108C9000AC209EC9845ACB02FAB24E1C0368B3B50D +:108CA00017C1A4488FBA97F0E3459AC053EA010070 +:108CB000000003C01F02B423210223210343410407 +:108CC000AC257500313233343536373839414243BB +:108CD00044454647484A4B4C4D4E505152535455CB +:108CE000565758595A6162636465666768696A6B6A +:108CF0006D6E6F707172737475767778797AE0E063 +:108D0000E0E0E0E0E0E0E0E0E0E0E02022242640F7 +:108D10004244484A4EC0C41601010001010101014C +:108D20000101000000000000A117D0C0411CD0C00C +:108D30007103D0C0DD16D0C0CD05D0C02504D0C091 +:108D40000912D0C00914D0C08910D0C0D11BD0C026 +:108D5000E903D0C02503D0C05502D0C06269746356 +:108D60006F696E636173680071707A7279397838EF +:108D7000676632747664773073336A6E35346B6845 +:108D80006365366D7561376C0000000000000000FF +:108D9000FFFFFF00000000000C400BF807FCC0F3D1 +:108DA000F03CF003FE012D00030000000000000075 +:108DB0000E0000000E000000010000008C8DD0C0ED +:108DC000948DD0C000000000FFFFFF00008001E68E +:108DD000C071383807FC001E8007F003CEC1E138AF +:108DE00070061800000000000E0000000E000000D9 +:108DF00001000000C48DD0C0CC8DD0C000000000A8 +:108E0000FFFFFF00000000000C8007F003FEC1FF21 +:108E1000F03FF003CC0033C00C0000000000000065 +:108E20000E0000000E00000001000000FC8DD0C00C +:108E3000048ED0C000000000FFFFFF0041110501BB +:108E4000070000000400000001000000348ED0C0C4 +:108E50003C8ED0C000000000FFFFFF0000000000BB +:108E60001EE01F1C0E03638C19630C0C87837F802C +:108E700007000000000000000E0000000E000000CF +:108E800001000000548ED0C05C8ED0C000000000F5 +:108E9000FFFFFF0048124208040000000700000026 +:108EA000010000008C8ED0C0948ED0C00000000065 +:108EB000FFFFFF00218424010400000007000000E0 +:108EC00001000000AC8ED0C0B48ED0C00000000005 +:108ED000FFFFFF00088A28080700000004000000C8 +:108EE00001000000CC8ED0C0D48ED0C000000000A5 +:108EF000FFFFFF00000000000000C000380067E036 +:108F0000381C9C037E000F80010000000000000060 +:108F10000E0000000E00000001000000EC8ED0C02A +:108F2000F48ED0C000000000FFFFFF000000300002 +:108F30000C80072001CC0033E01C3807FFC3F3F896 +:108F40007CFE1F00000000000E0000000E0000006C +:108F500001000000248FD0C02C8FD0C04175746FE9 +:108F600020417070726F76616C004D616E75616C3E +:108F700020417070726F76616C004261636B0050CB +:108F800075626C6963206B657973206578706F72A8 +:108F900074004170706C69636174696F6E0069730D +:108FA0002072656164790053657474696E6773003B +:108FB00056657273696F6E00312E352E3300517510 +:108FC0006974005369676E006D657373616765004E +:108FD0004D65737361676520686173680043616EF6 +:108FE00063656C007369676E6174757265005265C4 +:108FF00076696577007472616E73616374696F6E10 +:1090000000416D6F756E7400416464726573730026 +:10901000466565730041636365707400616E64202A +:1090200073656E640052656A656374004F505F53E8 +:10903000454E44455200436F6E6669726D00546838 +:10904000652064657269766174696F6E0070617421 +:109050006820697320756E757375616C21004465B5 +:109060007269766174696F6E207061746800526510 +:109070006A65637420696620796F75277265006E72 +:109080006F74207375726500417070726F76652021 +:1090900064657269766174696F6E00417070726F99 +:1090A000766500436F6E6669726D20746F6B656ED6 +:1090B000004578706F7274007075626C6963206B24 +:1090C00065793F00546865206368616E676520704C +:1090D00061746800697320756E757375616C004307 +:1090E00068616E67652070617468005468652073FC +:1090F00069676E2070617468005369676E207061E3 +:10910000746800556E766572696669656420696E7B +:10911000707574730055706461746500204C6564EB +:10912000676572204C697665006F72207468697299 +:10913000642070617274790077616C6C657420735F +:109140006F66747761726500436F6E74696E7565E2 +:10915000004F505F53454E4445525F435245415482 +:1091600045004F505F435245415445004C0E968C8C +:109170000044656C656761746520746F20257320F9 +:109180002866656520256420252529003D666E8BAF +:109190000030313233343536373839414243444573 +:1091A000460043616C6C20636F6E7472616374205F +:1091B0002573006F6D6E69004F4D4E492000555369 +:1091C000445420004D41494420004F4D4E492061F8 +:1091D000737365742025642000252E2A482E2E2EB8 +:1091E000252E2A48006F757470757420232564003D +:1091F0005174756D005154554D00716300000000AD +:109200005C8FD0C06A8FD0C07A8FD0C07F8FD0C023 +:109210007A8FD0C0928FD0C09E8FD0C0257DD0C015 +:109220001492D0C00000000000000000CD3BD0C070 +:109230000000000000000000000000002C92D0C0E0 +:10924000FFFFFFFFB08DD0C0A78FD0C0B981D0C0C5 +:109250004492D0C03C92D0C000000000B08FD0C07B +:10926000B88FD0C0D97CD0C05C92D0C000000000C4 +:1092700000000000E93BD0C000000000000000003A +:10928000000000007492D0C0FFFFFFFF208ED0C00E +:10929000BE8FD0C0B981D0C08C92D0C08492D0C0D3 +:1092A000000000001C92D0C04C92D0C06492D0C08C +:1092B0009492D0C0FDFFFFFFFFFFFFFFF33BD0C044 +:1092C000000000000000000000000000BC92D0C0C0 +:1092D000FFFFFFFF108FD0C0A390D0C0B0200020B0 +:1092E0006D82D0C0D492D0C0CC92D0C0000000001B +:1092F000013CD0C0000000000000000000000000A1 +:10930000F092D0C0FFFFFFFFE88DD0C02590D0C005 +:10931000B981D0C00893D0C00093D0C00000000035 +:10932000E092D0C01093D0C0FFFFFFFF0F3CD0C031 +:109330000000000000000000000000002C93D0C0DE +:10934000FFFFFFFF108FD0C0B190D0C0B890D0C049 +:109350006D82D0C04493D0C03C93D0C000000000C8 +:109360001D3CD0C000000000000000000000000014 +:109370006093D0C0FFFFFFFFE88DD0C02590D0C024 +:10938000B981D0C07893D0C07093D0C000000000E5 +:109390005093D0C08093D0C0FFFFFFFF788ED0C025 +:1093A000C490D0C0D490D0C06D82D0C09C93D0C0A7 +:1093B0000000000000000000DF90D0C00018002076 +:1093C000D980D0C0B893D0C00000000000000000D9 +:1093D0002B3CD0C000000000000000000000000096 +:1093E000D093D0C0FFFFFFFFE88DD0C06E90D0C0FB +:1093F0007F90D0C06D82D0C0E893D0C0E093D0C041 +:1094000000000000393CD0C0000000000000000057 +:10941000000000000494D0C0FFFFFFFF108FD0C0F9 +:109420009B90D0C0B981D0C01C94D0C01494D0C03F +:1094300000000000A893D0C0C093D0C0F493D0C067 +:109440002494D0C0FFFFFFFF788ED0C0EB90D0C037 +:10945000D490D0C06D82D0C04894D0C0000000002D +:1094600000000000F990D0C000180020D980D0C0C2 +:109470006494D0C00000000000000000473CD0C051 +:109480000000000000000000000000007C94D0C03C +:10949000FFFFFFFFE88DD0C06E90D0C07F90D0C09E +:1094A0006D82D0C09494D0C08C94D0C000000000D5 +:1094B000573CD0C000000000000000000000000089 +:1094C000B094D0C0FFFFFFFF108FD0C09B90D0C0E2 +:1094D000B981D0C0C894D0C0C094D0C000000000F2 +:1094E0005494D0C06C94D0C0A094D0C0D094D0C0BC +:1094F000FFFFFFFF488FD0C00391D0C0B981D0C01B +:10950000F494D0C000000000000000001591D0C00D +:109510001C91D0C0257DD0C00C95D0C000000000AB +:10952000000000002991D0C03891D0C0257DD0C066 +:109530002495D0C00000000000000000673CD0C0AF +:109540000000000000000000000000003C95D0C0BA +:10955000FFFFFFFFE88DD0C0DD8FD0C0B981D0C044 +:109560005495D0C04C95D0C000000000753CD0C0D0 +:109570000000000000000000000000006C95D0C05A +:10958000FFFFFFFF108FD0C04891D0C0B981D0C07D +:109590008495D0C07C95D0C000000000FC94D0C061 +:1095A0001495D0C02C95D0C05C95D0C08C95D0C0FF +:1095B000FFFFFFFF4F505F52455455524E000000D1 +:1095C000556E64656C65676174650000000000009D +:1095D000B001000000B0A7000000B00200000030A1 +:1095E0003132333435363738396162636465663019 +:1095F0003132333435363738394142434445466F8A +:1096000000900167006985F1D000000000425443DA +:109610000090009000006A805532465F56329000FC +:10962000010990006E006D00FFFFFFFF00000000C9 +:10963000092111012101222200000000092111014C +:10964000000122220006D0F10901A1010903150041 +:1096500026FF007508954081080904150026FF00C3 +:10966000750895409108C006A0FF0901A1010903F2 +:10967000150026FF0075089540810809041500268D +:10968000FF00750895409108C0050F3900021810B9 +:10969000050038B60834A909A0478BFDA0768815C7 +:1096A000B66500011E001C100500DF60DDD889458D +:1096B000C74C9CD2659D9E648A9F00000306B20041 +:1096C000770000003976D0C04976D0C05976D0C036 +:1096D0006976D0C07976D0C08976D0C09976D0C06E +:1096E000A976D0C012034D0053004600540031004B +:1096F0003000300077002800000000010400010065 +:10970000000000000000020157494E55534200007E +:1097100000000000000000000000000000009200B7 +:1097200000000001050001008800000007000000A3 +:109730002A00440065007600690063006500490066 +:109740006E007400650072006600610063006500D1 +:10975000470055004900440073000000500000001D +:109760007B003100330064003600330034003000E9 +:1097700030002D0032004300390037002D0030004A +:109780003000300034002D00300030003000300058 +:109790002D003400630036003500360034003600FA +:1097A000370036003500370032007D000000000031 +:1097B0000A00000000000306B200080001000000DB +:1097C000A800080002000200A0001400030057498E +:1097D0004E555342000000000000000000008400CD +:1097E000040007002A004400650076006900630059 +:1097F000650049006E00740065007200660061003B +:1098000063006500470055004900440073000000F4 +:1098100050007B0043004500380030003900320022 +:10982000360034002D0034004200320034002D0098 +:1098300034004500380031002D004100380042005E +:1098400032002D0035003700450044003000310063 +:109850004400350038003000450031007D00000034 +:1098600000000000E573D0C01774D0C04D73D0C0A5 +:1098700000000000000000003D75D0C05575D0C04C +:109880000000000000000000000000000578D0C0CB +:109890000578D0C00578D0C01578D0C0C574D0C0C8 +:1098A0001774D0C04D73D0C000000000000000004D +:1098B000F974D0C01175D0C0000000000000000095 +:1098C000000000000578D0C00578D0C00578D0C071 +:1098D0001578D0C0A175D0C0CD75D0C0D175D0C01D +:1098E0000000000000000000D575D0C0ED75D0C0AC +:1098F0000000000000000000000000000578D0C05B +:109900000578D0C00578D0C01578D0C012011002FB +:1099100000000040972C0100010201020301040332 +:1099200009040E034C0065006400670065007200C6 +:109930000E034E0061006E006F00200053000A030A +:10994000300030003000310009026000030102C025 +:109950003209040000020300000209211101000184 +:109960002222000705820340000107050203400090 +:109970000109040100020301010209211101210171 +:109980002222000705810340000107050103400072 +:10999000010904020002FFFFFF02070583034000E4 +:1099A00001070503034000010A0600020000004011 +:1099B0000100000003000000000080002000000003 +:1099C0000100000000000000FFFFFF000000000099 +:1099D00000000000050102000C0004000700000068 +:1099E00000000000FFFFFF0000000000000000007A +:1099F000988ED0C005027A000C0004000700000019 +:109A000000000000FFFFFF00000000000000000059 +:109A1000B88ED0C0071000000C00800020000000AD +:109A200000000000FFFFFF000000000008800000B1 +:109A300000000000071100001A0080002000000054 +:109A400000000000FFFFFF00000000000880000091 +:109A50000000000003000000000080002000000063 +:109A60000100000000000000FFFFFF0000000000F8 +:109A700000000000050100000E00070004000000C7 +:109A800000000000FFFFFF000000000000000000D9 +:109A9000D88ED0C0050278000E0007000400000038 +:109AA00000000000FFFFFF000000000000000000B9 +:109AB000408ED0C00711000003008000200000008D +:109AC00000000000FFFFFF00000000000A8000000F +:109AD00000000000071200001300800020000000BA +:109AE00000000000FFFFFF000000000008800000F1 +:109AF0000000000007130000230080002000000089 +:109B000000000000FFFFFF00000000000A800000CE +:109B1000000000002573202825642F2564290025D6 +:109B2000642F256400252E2A730000000300000026 +:109B30000000800020000000010000000000000084 +:109B4000FFFFFF0000000000000000000501020010 +:109B50000C0004000700000000000000FFFFFF00F1 +:109B60000000000000000000988ED0C005027A00BE +:109B70000C0004000700000000000000FFFFFF00D1 +:109B80000000000000000000B88ED0C005103800B2 +:109B9000020010001000000000000000FFFFFF00A6 +:109BA000000000000A800000000000000711000013 +:109BB0001C0080002000000000000000FFFFFF00EC +:109BC000000000000880000000000000030000000A +:109BD00000008000200000000100000000000000E4 +:109BE000FFFFFF0000000000000000000501020070 +:109BF0000C0004000700000000000000FFFFFF0051 +:109C00000000000000000000988ED0C005027A001D +:109C10000C0004000700000000000000FFFFFF0030 +:109C20000000000000000000B88ED0C0050F10003A +:109C3000080010001000000000000000FFFFFF00FF +:109C400000000000000000000000000007102900D4 +:109C50000C0080002000000000000000FFFFFF005B +:109C600000000000080000000000000007112900AB +:109C70001A0080002000000000000000FFFFFF002D +:109C80000000000008000000000000008183D0C038 +:109C9000081E002000000000000000008C9CD0C0C6 +:109CA000FFFFFFFF000000000000000000000000B8 +:109CB00000000000000000000000000000000000A4 +:109CC0000000000000000000000000000000000094 +:109CD0000000000000000000000000000000000084 +:109CE0000000000000000000000000000000000074 +:109CF0000000000000000000000000000000000064 +:04000005C0D0000166 +:00000001FF diff --git a/src/qt/res/ledger/nanos_stake_delete.txt b/src/qt/res/ledger/nanos_stake_delete.txt new file mode 100644 index 0000000000..9c13e90e02 --- /dev/null +++ b/src/qt/res/ledger/nanos_stake_delete.txt @@ -0,0 +1 @@ +python3 -m ledgerblue.deleteApp --targetId 0x31100004 --appName "Qtum Stake" --rootPrivateKey fea057826208738ba33ff0e1ebb8ebf682ab73753afb2d988df03b1b59187d58 diff --git a/src/qt/res/ledger/nanos_stake_load.txt b/src/qt/res/ledger/nanos_stake_load.txt new file mode 100644 index 0000000000..a78371e860 --- /dev/null +++ b/src/qt/res/ledger/nanos_stake_load.txt @@ -0,0 +1 @@ +python3 -m ledgerblue.loadApp --curve secp256k1 --tlv --targetId 0x31100004 --targetVersion="1.6.1" --delete --fileName :/ledger/nanos_stake_app --appName "Qtum Stake" --appVersion 1.5.3 --dataSize 64 --icon 010000000000ffffffffffffffffff1ffc0ff847f1a7f247f1a7f247f10ff01fe0fff7ffffffffffff --rootPrivateKey fea057826208738ba33ff0e1ebb8ebf682ab73753afb2d988df03b1b59187d58 --path "" --path "44'/88'" --path "45'/88'" --path "48'/88'" --path "49'/88'" --path "84'/88'" --path "0'/45342'" --path "20698'/3053'/12648430'" --appFlags 0xa50 From 28f06a9d9f13407cfe62a5ff0bb1832db4ae49a9 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 12 Apr 2021 13:44:05 +0200 Subject: [PATCH 105/164] Add method for set staker ledger id --- src/interfaces/wallet.cpp | 4 ++++ src/interfaces/wallet.h | 3 +++ 2 files changed, 7 insertions(+) diff --git a/src/interfaces/wallet.cpp b/src/interfaces/wallet.cpp index 15bd801c1d..534cc90363 100644 --- a/src/interfaces/wallet.cpp +++ b/src/interfaces/wallet.cpp @@ -1467,6 +1467,10 @@ class WalletImpl : public Wallet return true; } + void setStakerLedgerId(const std::string& ledgerId) override + { + m_wallet->m_ledger_id = ledgerId; + } std::unique_ptr handleUnload(UnloadFn fn) override { return MakeHandler(m_wallet->NotifyUnload.connect(fn)); diff --git a/src/interfaces/wallet.h b/src/interfaces/wallet.h index 58dee3bfe6..f72ac418c1 100644 --- a/src/interfaces/wallet.h +++ b/src/interfaces/wallet.h @@ -434,6 +434,9 @@ class Wallet //! Set signed add delegation data. virtual bool setAddDelegationData(std::string& psbt, const std::map& signData, std::string& error) = 0; + //! Set staker ledger id. + virtual void setStakerLedgerId(const std::string& ledgerId) = 0; + //! Register handler for unload message. using UnloadFn = std::function; virtual std::unique_ptr handleUnload(UnloadFn fn) = 0; From 1d11d59bb6bf60ff48c0928c2b95b8aea4a35fe1 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 12 Apr 2021 15:45:19 +0200 Subject: [PATCH 106/164] Select ledger for staking --- src/interfaces/wallet.cpp | 6 ++++++ src/interfaces/wallet.h | 3 +++ src/qt/hardwaresigntx.cpp | 10 +++++----- src/qt/hardwaresigntx.h | 3 ++- src/qt/stakepage.cpp | 34 +++++++++++++++++++++++++++++++++- src/qt/stakepage.h | 1 + src/qt/walletmodel.cpp | 19 ++++++++++++++++--- src/qt/walletmodel.h | 4 ++-- 8 files changed, 68 insertions(+), 12 deletions(-) diff --git a/src/interfaces/wallet.cpp b/src/interfaces/wallet.cpp index 534cc90363..e076a9d2a8 100644 --- a/src/interfaces/wallet.cpp +++ b/src/interfaces/wallet.cpp @@ -1469,8 +1469,14 @@ class WalletImpl : public Wallet } void setStakerLedgerId(const std::string& ledgerId) override { + LOCK(m_wallet->cs_wallet); m_wallet->m_ledger_id = ledgerId; } + std::string getStakerLedgerId() override + { + LOCK(m_wallet->cs_wallet); + return m_wallet->m_ledger_id; + } std::unique_ptr handleUnload(UnloadFn fn) override { return MakeHandler(m_wallet->NotifyUnload.connect(fn)); diff --git a/src/interfaces/wallet.h b/src/interfaces/wallet.h index f72ac418c1..4fab0d202d 100644 --- a/src/interfaces/wallet.h +++ b/src/interfaces/wallet.h @@ -437,6 +437,9 @@ class Wallet //! Set staker ledger id. virtual void setStakerLedgerId(const std::string& ledgerId) = 0; + //! Get staker ledger id. + virtual std::string getStakerLedgerId() = 0; + //! Register handler for unload message. using UnloadFn = std::function; virtual std::unique_ptr handleUnload(UnloadFn fn) = 0; diff --git a/src/qt/hardwaresigntx.cpp b/src/qt/hardwaresigntx.cpp index 75e1ffd762..e21d935b7d 100644 --- a/src/qt/hardwaresigntx.cpp +++ b/src/qt/hardwaresigntx.cpp @@ -27,7 +27,7 @@ void HardwareSignTx::setModel(WalletModel *_model) tool->setModel(_model); } -bool HardwareSignTx::askDevice() +bool HardwareSignTx::askDevice(bool stake) { // Check if the HWI tool exist QString hwiToolPath = GUIUtil::getHwiToolPath(); @@ -43,16 +43,16 @@ bool HardwareSignTx::askDevice() } // Ask for ledger - QString fingerprint = model->getFingerprint(); + QString fingerprint = model->getFingerprint(stake); QString title = tr("Connect Ledger"); QString message = tr("Please insert your Ledger (%1). Verify the cable is connected and that no other application is using it.\n\nTry to connect again?"); - if(HardwareKeystoreDialog::AskDevice(fingerprint, title, message.arg(fingerprint), widget)) + if(HardwareKeystoreDialog::AskDevice(fingerprint, title, message.arg(fingerprint))) { - model->setFingerprint(fingerprint); + model->setFingerprint(fingerprint, stake); return true; } - model->setFingerprint(""); + model->setFingerprint("", stake); return false; } diff --git a/src/qt/hardwaresigntx.h b/src/qt/hardwaresigntx.h index 821704c324..80e0837ce3 100644 --- a/src/qt/hardwaresigntx.h +++ b/src/qt/hardwaresigntx.h @@ -41,9 +41,10 @@ class HardwareSignTx : public QObject /** * @brief askDevice Ask for hardware device + * @param stake Use the device for staking * @return success of the operation */ - bool askDevice(); + bool askDevice(bool stake = false); /** * @brief sign Sign transaction diff --git a/src/qt/stakepage.cpp b/src/qt/stakepage.cpp index f0cc826997..3df7e0b4e1 100644 --- a/src/qt/stakepage.cpp +++ b/src/qt/stakepage.cpp @@ -15,11 +15,13 @@ #include #include #include +#include #include #include #include +#include Q_DECLARE_METATYPE(interfaces::WalletBalances) @@ -103,10 +105,24 @@ void StakePage::on_checkStake_clicked(bool checked) if(!walletModel) return; - this->walletModel->wallet().setEnabledStaking(checked); + bool privateKeysDisabled = walletModel->wallet().privateKeysDisabled(); + if(!privateKeysDisabled) + walletModel->wallet().setEnabledStaking(checked); if(checked && WalletModel::Locked == walletModel->getEncryptionStatus()) Q_EMIT requireUnlock(true); + + if(privateKeysDisabled) + { + if(checked) + { + QTimer::singleShot(500, this, &StakePage::askDeviceForStake); + } + else + { + walletModel->wallet().setEnabledStaking(false); + } + } } void StakePage::updateDisplayUnit() @@ -175,3 +191,19 @@ void StakePage::updateEncryptionStatus() break; } } + +void StakePage::askDeviceForStake() +{ + // Get staking device + HardwareSignTx hardware(this); + hardware.setModel(walletModel); + bool staking = hardware.askDevice(true); + walletModel->wallet().setEnabledStaking(staking); + + // Update stake button + if(walletModel->wallet().getEnabledStaking()) + { + bool checked = ui->checkStake->isChecked(); + if(!checked) ui->checkStake->onStatusChanged(); + } +} diff --git a/src/qt/stakepage.h b/src/qt/stakepage.h index c7a99997bb..433ac13d16 100644 --- a/src/qt/stakepage.h +++ b/src/qt/stakepage.h @@ -36,6 +36,7 @@ public Q_SLOTS: void setBalance(const interfaces::WalletBalances& balances); void numBlocksChanged(int count, const QDateTime& blockDate, double nVerificationProgress, bool headers); void updateEncryptionStatus(); + void askDeviceForStake(); Q_SIGNALS: void requireUnlock(bool fromMenu); diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index 5d2e116f3b..a2862c211b 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -840,14 +840,27 @@ void WalletModel::checkCoinAddresses() updateCoinAddresses = true; } -QString WalletModel::getFingerprint() const +QString WalletModel::getFingerprint(bool stake) const { + if(stake) + { + std::string ledgerId = wallet().getStakerLedgerId(); + return QString::fromStdString(ledgerId); + } + return fingerprint; } -void WalletModel::setFingerprint(const QString &value) +void WalletModel::setFingerprint(const QString &value, bool stake) { - fingerprint = value; + if(stake) + { + wallet().setStakerLedgerId(value.toStdString()); + } + else + { + fingerprint = value; + } } void WalletModel::checkHardwareWallet() diff --git a/src/qt/walletmodel.h b/src/qt/walletmodel.h index e802631848..e7dc08928d 100644 --- a/src/qt/walletmodel.h +++ b/src/qt/walletmodel.h @@ -178,8 +178,8 @@ class WalletModel : public QObject AddressTableModel* getAddressTableModel() const { return addressTableModel; } // Get or set selected hardware device fingerprint (only for hardware wallet applicable) - QString getFingerprint() const; - void setFingerprint(const QString &value); + QString getFingerprint(bool stake = false) const; + void setFingerprint(const QString &value, bool stake = false); // Get or set hardware wallet init required (only for hardware wallet applicable) void importAddressesData(bool rescan = true, bool importPKH = true, bool importP2SH = true, bool importBech32 = true); From 5735a12036444470e850944893a04f3353e71e53 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Tue, 13 Apr 2021 10:22:25 +0200 Subject: [PATCH 107/164] Add is connected method to check ledger device --- src/qtum/qtumledger.cpp | 76 +++++++++++++++++++++++++++++++++++++++++ src/qtum/qtumledger.h | 29 ++++++++++++++++ 2 files changed, 105 insertions(+) diff --git a/src/qtum/qtumledger.cpp b/src/qtum/qtumledger.cpp index d3c7d3b283..ed7b3d94d6 100644 --- a/src/qtum/qtumledger.cpp +++ b/src/qtum/qtumledger.cpp @@ -26,6 +26,15 @@ UniValue json_get_object(const UniValue& jsondata) return v; } +// Read json array +UniValue json_get_array(const UniValue& jsondata) +{ + UniValue v(UniValue::VARR); + if(jsondata.isArray()) + v = jsondata.get_array(); + return v; +} + // Get json string for key std::string json_get_key_string(const UniValue& jsondata, std::string key) { @@ -260,3 +269,70 @@ bool QtumLedger::endSignBlockHeader(const std::string &, const std::string &, co return false; } + +bool QtumLedger::isConnected(const std::string &fingerprint) +{ + // Check if a device is connected + std::vector devices; + if(enumerate(devices)) + { + for(LedgerDevice device: devices) + { + if(device.fingerprint == fingerprint) + return true; + } + } + return false; +} + +bool QtumLedger::enumerate(std::vector &devices) +{ + // Enumerate hardware wallet devices + if(isStarted()) + return false; + + if(!beginEnumerate(devices)) + return false; + + wait(); + + return endEnumerate(devices); +} + +bool QtumLedger::beginEnumerate(std::vector &) +{ + // Execute command line + std::vector arguments = d->arguments; + arguments << "enumerate"; + d->process.start(d->toolPath, arguments); + d->fStarted = true; + + return d->fStarted; +} + +bool QtumLedger::endEnumerate(std::vector &devices) +{ + // Decode command line results + UniValue jsonDocument = json_read_doc(d->strStdout); + UniValue jsonDevices = json_get_array(jsonDocument); + for(size_t i = 0; i < jsonDevices.size(); i++) + { + const UniValue& jsonDevice = jsonDevices[i]; + if(!jsonDevice.isObject()) + return false; + + // Get device info + UniValue data = json_get_object(jsonDevice); + LedgerDevice device; + device.fingerprint = json_get_key_string(data, "fingerprint"); + device.serial_number = json_get_key_string(data, "serial_number"); + device.type = json_get_key_string(data, "type"); + device.path = json_get_key_string(data, "path"); + device.error = json_get_key_string(data, "error"); + device.model = json_get_key_string(data, "model"); + device.code = json_get_key_string(data, "code"); + devices.push_back(device); + } + + return devices.size() > 0; +} diff --git a/src/qtum/qtumledger.h b/src/qtum/qtumledger.h index e66a3992d3..66fa4dbf04 100644 --- a/src/qtum/qtumledger.h +++ b/src/qtum/qtumledger.h @@ -6,6 +6,18 @@ class QtumLedgerPriv; +struct LedgerDevice +{ + /// Device data + std::string fingerprint; + std::string serial_number; + std::string type; + std::string path; + std::string error; + std::string model; + std::string code; +}; + /** * @brief The QtumLedger class Communicate with the qtum ledger */ @@ -40,6 +52,20 @@ class QtumLedger { */ bool signBlockHeader(const std::string& fingerprint, const std::string& header, const std::string& path, std::vector& vchSig); + /** + * @brief isConnected Check if a device is connected + * @param fingerprint Hardware wallet device fingerprint + * @return success of the operation + */ + bool isConnected(const std::string& fingerprint); + + /** + * @brief enumerate Enumerate hardware wallet devices + * @param devices List of devices + * @return success of the operation + */ + bool enumerate(std::vector& devices); + private: bool toolExists(); bool isStarted(); @@ -51,6 +77,9 @@ class QtumLedger { bool beginSignBlockHeader(const std::string& fingerprint, const std::string& header, const std::string& path, std::vector& vchSig); bool endSignBlockHeader(const std::string& fingerprint, const std::string& header, const std::string& path, std::vector& vchSig); + bool beginEnumerate(std::vector& devices); + bool endEnumerate(std::vector& devices); + private: QtumLedger(const QtumLedger&); QtumLedger& operator=(const QtumLedger&); From ba718b22d8d6fcd096d121f17d1b7e82b850b54d Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Tue, 13 Apr 2021 13:03:06 +0200 Subject: [PATCH 108/164] Update miner to check if ledger is connected --- src/miner.cpp | 32 ++++++++++++++++++++++++++++++++ src/qtum/qtumledger.cpp | 22 +++++++++++++++++----- src/qtum/qtumledger.h | 2 ++ src/validation.cpp | 2 +- 4 files changed, 52 insertions(+), 6 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index 876eadcc00..8a7dcae221 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #ifdef ENABLE_WALLET #include #endif @@ -1432,6 +1433,12 @@ class StakeMiner : public IStakeMiner // Cache mining data if(!CacheData()) continue; + // Check if ledger is connected + if(d->privateKeysDisabled) + { + if(!isLedgerConnected()) continue; + } + // Check if miner have coins for staking if(HaveCoinsForStake()) { @@ -1842,6 +1849,31 @@ class StakeMiner : public IStakeMiner SetThreadPriority(THREAD_PRIORITY_LOWEST); return false; } + + bool isLedgerConnected() + { + if(d->pwallet->IsStakeClosing()) + return false; + + std::string ledgerId; + { + LOCK(d->pwallet->cs_wallet); + ledgerId = d->pwallet->m_ledger_id; + } + + if(ledgerId.empty()) + return false; + + QtumLedger &device = QtumLedger::instance(); + bool fConnected = device.isConnected(ledgerId); + if(!fConnected) + { + d->pwallet->m_last_coin_stake_search_interval = 0; + LogPrintf("ThreadStakeMiner(): Ledger not connected with fingerprint %s\n", d->pwallet->m_ledger_id); + } + + return fConnected; + } }; IStakeMiner *createMiner() diff --git a/src/qtum/qtumledger.cpp b/src/qtum/qtumledger.cpp index ed7b3d94d6..3b94fe9cba 100644 --- a/src/qtum/qtumledger.cpp +++ b/src/qtum/qtumledger.cpp @@ -273,15 +273,21 @@ bool QtumLedger::endSignBlockHeader(const std::string &, const std::string &, co bool QtumLedger::isConnected(const std::string &fingerprint) { // Check if a device is connected - std::vector devices; - if(enumerate(devices)) + try { - for(LedgerDevice device: devices) + std::vector devices; + if(enumerate(devices)) { - if(device.fingerprint == fingerprint) - return true; + for(LedgerDevice device: devices) + { + if(device.fingerprint == fingerprint) + return true; + } } } + catch(...) + {} + return false; } @@ -336,3 +342,9 @@ bool QtumLedger::endEnumerate(std::vector &devices) return devices.size() > 0; } + +QtumLedger &QtumLedger::instance() +{ + static QtumLedger device; + return device; +} diff --git a/src/qtum/qtumledger.h b/src/qtum/qtumledger.h index 66fa4dbf04..a0f6d812d2 100644 --- a/src/qtum/qtumledger.h +++ b/src/qtum/qtumledger.h @@ -66,6 +66,8 @@ class QtumLedger { */ bool enumerate(std::vector& devices); + static QtumLedger &instance(); + private: bool toolExists(); bool isStarted(); diff --git a/src/validation.cpp b/src/validation.cpp index 898bdff414..373d4746fd 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -4765,7 +4765,7 @@ bool SignBlockHWI(std::shared_ptr pblock, CWallet& wallet, std::vector Date: Tue, 13 Apr 2021 15:09:11 +0200 Subject: [PATCH 109/164] Add message 'Not staking because the ledger fail to connect' --- src/qt/bitcoingui.cpp | 2 ++ src/qt/superstakeritemwidget.cpp | 2 ++ src/qt/walletmodel.cpp | 7 +++++++ src/qt/walletmodel.h | 1 + 4 files changed, 12 insertions(+) diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 1f5ff78775..6538c1162d 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -1618,6 +1618,8 @@ void BitcoinGUI::updateStakingIcon() labelStakingIcon->setToolTip(tr("Not staking because you don't have mature coins")); else if (walletModel->wallet().isLocked()) labelStakingIcon->setToolTip(tr("Not staking because wallet is locked")); + else if(walletModel->hasLedgerProblem()) + labelStakingIcon->setToolTip(tr("Not staking because the ledger fail to connect")); else labelStakingIcon->setToolTip(tr("Not staking")); } diff --git a/src/qt/superstakeritemwidget.cpp b/src/qt/superstakeritemwidget.cpp index ab6effc9d8..082cb4c117 100644 --- a/src/qt/superstakeritemwidget.cpp +++ b/src/qt/superstakeritemwidget.cpp @@ -192,6 +192,8 @@ void SuperStakerItemWidget::updateLogo() ui->superStakerLogo->setToolTip(tr("Not staking because you don't have mature delegated coins")); else if (m_model->wallet().isLocked()) ui->superStakerLogo->setToolTip(tr("Not staking because wallet is locked")); + else if(m_model->hasLedgerProblem()) + ui->superStakerLogo->setToolTip(tr("Not staking because the ledger fail to connect")); else ui->superStakerLogo->setToolTip(tr("Not staking")); } diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index a2862c211b..9d797cac04 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -937,3 +937,10 @@ bool WalletModel::createUnsigned() return false; } + +bool WalletModel::hasLedgerProblem() +{ + return wallet().privateKeysDisabled() && + wallet().getEnabledStaking() && + !getFingerprint(true).isEmpty(); +} diff --git a/src/qt/walletmodel.h b/src/qt/walletmodel.h index e7dc08928d..e1a5edb3c4 100644 --- a/src/qt/walletmodel.h +++ b/src/qt/walletmodel.h @@ -185,6 +185,7 @@ class WalletModel : public QObject void importAddressesData(bool rescan = true, bool importPKH = true, bool importP2SH = true, bool importBech32 = true); bool getSignPsbtWithHwiTool(); bool createUnsigned(); + bool hasLedgerProblem(); private: std::unique_ptr m_wallet; From 3f7a2becc231d017c28c3e68e9b5a064716ca420 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Tue, 13 Apr 2021 16:12:37 +0200 Subject: [PATCH 110/164] Update start stake method --- src/wallet/wallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 22f6068fd0..1b2ec3c941 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -5769,7 +5769,7 @@ void CWallet::StakeQtums(bool fStake, CConnman* connman) void CWallet::StartStake(CConnman *connman) { - m_enabled_staking = !IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS); + m_enabled_staking = IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS) ? !m_ledger_id.empty() : true; StakeQtums(true, connman); } From 727f1468afe32ef2e5c07f212ab0b2e4cbccb167 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Wed, 14 Apr 2021 09:29:46 +0200 Subject: [PATCH 111/164] Set default value for max outputs to 20 for split coins for ledger --- src/qt/splitutxopage.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/qt/splitutxopage.cpp b/src/qt/splitutxopage.cpp index 59b4640c86..2d4aaa430c 100644 --- a/src/qt/splitutxopage.cpp +++ b/src/qt/splitutxopage.cpp @@ -116,6 +116,11 @@ void SplitUTXOPage::setModel(WalletModel *_model) ui->splitCoinsButton->setText(tr("Cr&eate Unsigned")); ui->splitCoinsButton->setToolTip(tr("Creates a Partially Signed Qtum Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME)); } + + if(m_model && m_model->wallet().privateKeysDisabled()) + { + ui->spinBoxMaxOutputs->setValue(20); + } } void SplitUTXOPage::setAddress(const QString &address) From ccfd16ab27437c11a16fcf5849c911d7b89d2443 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Wed, 14 Apr 2021 09:45:15 +0200 Subject: [PATCH 112/164] Fix stake button state --- src/qt/stakepage.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/qt/stakepage.cpp b/src/qt/stakepage.cpp index 3df7e0b4e1..3b36976cd5 100644 --- a/src/qt/stakepage.cpp +++ b/src/qt/stakepage.cpp @@ -201,9 +201,6 @@ void StakePage::askDeviceForStake() walletModel->wallet().setEnabledStaking(staking); // Update stake button - if(walletModel->wallet().getEnabledStaking()) - { - bool checked = ui->checkStake->isChecked(); - if(!checked) ui->checkStake->onStatusChanged(); - } + bool checked = ui->checkStake->isChecked(); + if(checked != staking) ui->checkStake->onStatusChanged(); } From d35ab2fe612bf46bddf91595a0ba611f216a1532 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Wed, 14 Apr 2021 10:12:58 +0200 Subject: [PATCH 113/164] Update getwalletinfo RPC to display the hardware wallet balance --- src/wallet/rpcwallet.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index e7708c646b..08bc5aa7ab 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4364,12 +4364,24 @@ static UniValue getwalletinfo(const JSONRPCRequest& request) size_t kpExternalSize = pwallet->KeypoolCountExternalKeys(); const auto bal = pwallet->GetBalance(); + CAmount balance = bal.m_mine_trusted; + CAmount stake = bal.m_mine_stake; + CAmount unconfirmedBalance = bal.m_mine_untrusted_pending; + CAmount immatureBalance = bal.m_mine_immature; + bool privateKeysEnabled = !pwallet->IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS); + if(!privateKeysEnabled) + { + balance += bal.m_watchonly_trusted; + stake += bal.m_watchonly_stake; + unconfirmedBalance += bal.m_watchonly_untrusted_pending; + immatureBalance += bal.m_watchonly_immature; + } obj.pushKV("walletname", pwallet->GetName()); obj.pushKV("walletversion", pwallet->GetVersion()); - obj.pushKV("balance", ValueFromAmount(bal.m_mine_trusted)); - obj.pushKV("stake", ValueFromAmount(bal.m_mine_stake)); - obj.pushKV("unconfirmed_balance", ValueFromAmount(bal.m_mine_untrusted_pending)); - obj.pushKV("immature_balance", ValueFromAmount(bal.m_mine_immature)); + obj.pushKV("balance", ValueFromAmount(balance)); + obj.pushKV("stake", ValueFromAmount(stake)); + obj.pushKV("unconfirmed_balance", ValueFromAmount(unconfirmedBalance)); + obj.pushKV("immature_balance", ValueFromAmount(immatureBalance)); obj.pushKV("txcount", (int)pwallet->mapWallet.size()); obj.pushKV("keypoololdest", pwallet->GetOldestKeyPoolTime()); obj.pushKV("keypoolsize", (int64_t)kpExternalSize); @@ -4389,7 +4401,7 @@ static UniValue getwalletinfo(const JSONRPCRequest& request) obj.pushKV("unlocked_until", pwallet->nRelockTime); } obj.pushKV("paytxfee", ValueFromAmount(pwallet->m_pay_tx_fee.GetFeePerK())); - obj.pushKV("private_keys_enabled", !pwallet->IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS)); + obj.pushKV("private_keys_enabled", privateKeysEnabled); obj.pushKV("avoid_reuse", pwallet->IsWalletFlagSet(WALLET_FLAG_AVOID_REUSE)); if (pwallet->IsScanning()) { UniValue scanning(UniValue::VOBJ); From d0cc65a396e99c738829b5b32674dbf867507778 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Wed, 14 Apr 2021 14:43:09 +0200 Subject: [PATCH 114/164] Update options dialog with stake ledger id --- src/qt/forms/optionsdialog.ui | 195 +++++++++++++++++++--------------- src/qt/hardwaresigntx.cpp | 9 +- src/qt/hardwaresigntx.h | 3 +- src/qt/optionsdialog.cpp | 22 ++++ src/qt/optionsdialog.h | 1 + src/qt/optionsmodel.cpp | 14 +++ src/qt/optionsmodel.h | 1 + 7 files changed, 157 insertions(+), 88 deletions(-) diff --git a/src/qt/forms/optionsdialog.ui b/src/qt/forms/optionsdialog.ui index b9ef0f93a2..d75c396d98 100644 --- a/src/qt/forms/optionsdialog.ui +++ b/src/qt/forms/optionsdialog.ui @@ -7,7 +7,7 @@ 0 0 832 - 541 + 587 @@ -69,10 +69,20 @@ 10 - - + + + + Disables some advanced features but all blocks will still be fully validated. Reverting this setting requires re-downloading the entire blockchain. Actual disk usage may be somewhat higher. + - Reserve + Prune &block storage to + + + + + + + Number of script &verification threads Qt::PlainText @@ -82,17 +92,7 @@ - - - - Disables some advanced features but all blocks will still be fully validated. Reverting this setting requires re-downloading the entire blockchain. Actual disk usage may be somewhat higher. - - - Prune &block storage to - - - - + @@ -122,43 +122,24 @@ - - + + - + - Reserve amount that will not be used for staking + Hardware wallet interface tool location on disk - - - Qt::Horizontal - - - - 40 - 0 - + + + ... - + - - - - Number of script &verification threads - - - Qt::PlainText - - - threadsScriptVerif - - - @@ -196,29 +177,6 @@ - - - - Size of &database cache - - - Qt::PlainText - - - databaseCache - - - - - - - Reverting this setting requires re-downloading the entire blockchain. - - - Qt::PlainText - - - @@ -249,20 +207,60 @@ - + + + + Reverting this setting requires re-downloading the entire blockchain. + + + Qt::PlainText + + + + + + + Size of &database cache + + + Qt::PlainText + + + databaseCache + + + + HWI tool path + + + + Reserve + + + Qt::PlainText + + + threadsScriptVerif + + + - + - + + + Fingerprint of the ledger that you want to be used for staking with hardware wallet + + - + ... @@ -270,22 +268,53 @@ + + + + Stake Ledger ID + + + + + + + + + Reserve amount that will not be used for staking + + + + + + + Qt::Horizontal + + + + 40 + 0 + + + + + + + + + + Enable log &events + + + + + + + Enable s&uper staking + + + - - - - Enable log &events - - - - - - - Enable s&uper staking - - - diff --git a/src/qt/hardwaresigntx.cpp b/src/qt/hardwaresigntx.cpp index e21d935b7d..8d503a24df 100644 --- a/src/qt/hardwaresigntx.cpp +++ b/src/qt/hardwaresigntx.cpp @@ -27,7 +27,7 @@ void HardwareSignTx::setModel(WalletModel *_model) tool->setModel(_model); } -bool HardwareSignTx::askDevice(bool stake) +bool HardwareSignTx::askDevice(bool stake, QString* pFingerprint) { // Check if the HWI tool exist QString hwiToolPath = GUIUtil::getHwiToolPath(); @@ -43,16 +43,17 @@ bool HardwareSignTx::askDevice(bool stake) } // Ask for ledger - QString fingerprint = model->getFingerprint(stake); + QString fingerprint = model ? model->getFingerprint(stake) : ""; QString title = tr("Connect Ledger"); QString message = tr("Please insert your Ledger (%1). Verify the cable is connected and that no other application is using it.\n\nTry to connect again?"); if(HardwareKeystoreDialog::AskDevice(fingerprint, title, message.arg(fingerprint))) { - model->setFingerprint(fingerprint, stake); + if(pFingerprint) *pFingerprint = fingerprint; + if(model) model->setFingerprint(fingerprint, stake); return true; } - model->setFingerprint("", stake); + if(model) model->setFingerprint("", stake); return false; } diff --git a/src/qt/hardwaresigntx.h b/src/qt/hardwaresigntx.h index 80e0837ce3..7ebef1a564 100644 --- a/src/qt/hardwaresigntx.h +++ b/src/qt/hardwaresigntx.h @@ -42,9 +42,10 @@ class HardwareSignTx : public QObject /** * @brief askDevice Ask for hardware device * @param stake Use the device for staking + * @param pFingerprint Pointer to selected ledger fingerprint * @return success of the operation */ - bool askDevice(bool stake = false); + bool askDevice(bool stake = false, QString* pFingerprint = nullptr); /** * @brief sign Sign transaction diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp index 2025200a1b..9e5ef58867 100644 --- a/src/qt/optionsdialog.cpp +++ b/src/qt/optionsdialog.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include // for DEFAULT_SCRIPTCHECK_THREADS and MAX_SCRIPTCHECK_THREADS @@ -102,6 +103,9 @@ OptionsDialog::OptionsDialog(QWidget *parent, bool enableWallet) : ui->txtHWIToolPath->setVisible(false); ui->toolHWIPath->setVisible(false); ui->HWIToolLabel->setVisible(false); + ui->txtStakeLedgerId->setVisible(false); + ui->toolStakeLedgerId->setVisible(false); + ui->stakeLedgerIdlabel->setVisible(false); } else { bool fHasHardwareWalletSupport = ::Params().HasHardwareWalletSupport(); @@ -109,6 +113,9 @@ OptionsDialog::OptionsDialog(QWidget *parent, bool enableWallet) : ui->toolHWIPath->setVisible(fHasHardwareWalletSupport); ui->HWIToolLabel->setVisible(fHasHardwareWalletSupport); ui->signPSBTHWITool->setVisible(fHasHardwareWalletSupport); + ui->txtStakeLedgerId->setVisible(fHasHardwareWalletSupport); + ui->toolStakeLedgerId->setVisible(fHasHardwareWalletSupport); + ui->stakeLedgerIdlabel->setVisible(fHasHardwareWalletSupport); } /* Display elements init */ @@ -222,6 +229,7 @@ void OptionsDialog::setModel(OptionsModel *_model) connect(ui->threadsScriptVerif, static_cast(&QSpinBox::valueChanged), this, &OptionsDialog::showRestartWarning); connect(ui->reserveBalance, SIGNAL(valueChanged()), this, SLOT(showRestartWarning())); connect(ui->txtHWIToolPath, SIGNAL(textChanged(const QString &)), this, SLOT(showRestartWarning())); + connect(ui->txtStakeLedgerId, SIGNAL(textChanged(const QString &)), this, SLOT(showRestartWarning())); /* Wallet */ connect(ui->spendZeroConfChange, &QCheckBox::clicked, this, &OptionsDialog::showRestartWarning); connect(ui->useChangeAddress, &QCheckBox::clicked, this, &OptionsDialog::showRestartWarning); @@ -258,6 +266,7 @@ void OptionsDialog::setMapper() mapper->addMapping(ui->superStaking, OptionsModel::SuperStaking); mapper->addMapping(ui->reserveBalance, OptionsModel::ReserveBalance); mapper->addMapping(ui->txtHWIToolPath, OptionsModel::HWIToolPath); + mapper->addMapping(ui->txtStakeLedgerId, OptionsModel::StakeLedgerId); /* Wallet */ mapper->addMapping(ui->spendZeroConfChange, OptionsModel::SpendZeroConfChange); @@ -369,6 +378,19 @@ void OptionsDialog::on_toolHWIPath_clicked() ui->txtHWIToolPath->setText(filename); } +void OptionsDialog::on_toolStakeLedgerId_clicked() +{ + // Get staking device + HardwareSignTx hardware(this); + QString fingerprint; + hardware.askDevice(true, &fingerprint); + + if (fingerprint.isEmpty()) + return; + + ui->txtStakeLedgerId->setText(fingerprint); +} + void OptionsDialog::on_hideTrayIcon_stateChanged(int fState) { if(fState) diff --git a/src/qt/optionsdialog.h b/src/qt/optionsdialog.h index 5bf831933d..f3c05ac77e 100644 --- a/src/qt/optionsdialog.h +++ b/src/qt/optionsdialog.h @@ -57,6 +57,7 @@ private Q_SLOTS: void on_okButton_clicked(); void on_cancelButton_clicked(); void on_toolHWIPath_clicked(); + void on_toolStakeLedgerId_clicked(); void on_hideTrayIcon_stateChanged(int fState); diff --git a/src/qt/optionsmodel.cpp b/src/qt/optionsmodel.cpp index 54685fd5ad..247dfe2f10 100644 --- a/src/qt/optionsmodel.cpp +++ b/src/qt/optionsmodel.cpp @@ -231,6 +231,12 @@ void OptionsModel::Init(bool resetSettings) if (!m_node.softSetArg("-hwitoolpath", settings.value("HWIToolPath").toString().toStdString())) addOverriddenOption("-hwitoolpath"); + + if (!settings.contains("StakeLedgerId")) + settings.setValue("StakeLedgerId", ""); + + if (!m_node.softSetArg("-stakerledgerid", settings.value("StakeLedgerId").toString().toStdString())) + addOverriddenOption("-stakerledgerid"); #endif } @@ -424,6 +430,8 @@ QVariant OptionsModel::data(const QModelIndex & index, int role) const #ifdef ENABLE_WALLET case HWIToolPath: return settings.value("HWIToolPath"); + case StakeLedgerId: + return settings.value("StakeLedgerId"); #endif default: return QVariant(); @@ -634,6 +642,12 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in setRestartRequired(true); } break; + case StakeLedgerId: + if (settings.value("StakeLedgerId") != value) { + settings.setValue("StakeLedgerId", value); + setRestartRequired(true); + } + break; #endif default: break; diff --git a/src/qt/optionsmodel.h b/src/qt/optionsmodel.h index 0a11b5622a..c2c4ab934a 100644 --- a/src/qt/optionsmodel.h +++ b/src/qt/optionsmodel.h @@ -72,6 +72,7 @@ class OptionsModel : public QAbstractListModel Theme, // QString HWIToolPath, // QString SignPSBTWithHWITool, // bool + StakeLedgerId, // QString OptionIDRowCount, }; From 49ac7633e4c095433e1b6bc2eb5fde948be1e639 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 15 Apr 2021 12:00:37 +0200 Subject: [PATCH 115/164] Update address list to display recent request address and coin addresses for hardware wallet in the list The update is to provide the same behaviour as normal wallet. Not just printing list of all 2000 addresses. --- src/interfaces/wallet.cpp | 2 ++ src/qt/walletmodel.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/interfaces/wallet.cpp b/src/interfaces/wallet.cpp index e076a9d2a8..5734c62c9b 100644 --- a/src/interfaces/wallet.cpp +++ b/src/interfaces/wallet.cpp @@ -685,6 +685,8 @@ class WalletImpl : public Wallet // Get the user created addresses in from the address book and add them if they are mine for (const auto& item : m_wallet->m_address_book) { if(!m_wallet->IsMine(item.first)) continue; + if(item.second.purpose != "receive") continue; + if(item.second.destdata.size() == 0) continue; std::string strAddress = EncodeDestination(item.first); if (mapAddress.find(strAddress) == mapAddress.end()) diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index 9d797cac04..f76703a670 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -99,6 +99,8 @@ WalletModel::WalletModel(std::unique_ptr wallet, interfaces: connect(addressTableModel, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(checkCoinAddresses())); connect(addressTableModel, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SLOT(checkCoinAddresses())); + connect(recentRequestsTableModel, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(checkCoinAddresses())); + connect(recentRequestsTableModel, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SLOT(checkCoinAddresses())); subscribeToCoreSignals(); } From fb6f9a5c5446765229b2b7271f03526058075ba8 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 15 Apr 2021 14:19:10 +0200 Subject: [PATCH 116/164] Hide console for child process in Windows --- src/qtum/qtumledger.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/qtum/qtumledger.cpp b/src/qtum/qtumledger.cpp index 3b94fe9cba..e4d802666f 100644 --- a/src/qtum/qtumledger.cpp +++ b/src/qtum/qtumledger.cpp @@ -7,6 +7,9 @@ #include #include #include +#ifdef WIN32 +#include +#endif namespace QtumLedger_NS { // Read json document @@ -78,8 +81,13 @@ class CProcess { boost::asio::io_service svc; boost::asio::streambuf out, err; +#ifdef WIN32 + boost::process::child child(m_program, ::boost::process::windows::create_no_window, boost::process::args(m_arguments), + boost::process::std_out > out, boost::process::std_err > err, svc); +#else boost::process::child child(m_program, boost::process::args(m_arguments), boost::process::std_out > out, boost::process::std_err > err, svc); +#endif svc.run(); child.wait(); From 9c7a50116ba16994e39050a4264977423cd1d579 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 16 Apr 2021 14:40:13 +0200 Subject: [PATCH 117/164] Fix qtumhwitool start for Windows when use .py script --- src/qt/qtumhwitool.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 6c06e3c6e8..96d4cada83 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -39,6 +39,8 @@ class QtumHwiToolPriv QtumHwiToolPriv(QObject *parent) { toolPath = GUIUtil::getHwiToolPath(); + initToolPath(); + QStringList optionalRescan = QStringList() << PARAM_START_HEIGHT << PARAM_STOP_HEIGHT; cmdRescan = new ExecRPCCommand("rescanblockchain", QStringList(), optionalRescan, QMap(), parent); QStringList mandatoryImport = QStringList() << PARAM_REQUESTS; @@ -55,6 +57,17 @@ class QtumHwiToolPriv } } + void initToolPath() + { +#ifdef WIN32 + if(toolPath.endsWith(".py", Qt::CaseInsensitive)) + { + arguments << toolPath; + toolPath = "python3"; + } +#endif + } + std::atomic fStarted{false}; QProcess process; QString strStdout; From 86d20d9a93f03f08fa7b837aa115cd3d7c744892 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 16 Apr 2021 16:23:08 +0200 Subject: [PATCH 118/164] Sleep for 10 seconds before new connection attempt for ledger when mining --- src/miner.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/miner.cpp b/src/miner.cpp index 8a7dcae221..3c7c28a2ac 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -1870,6 +1870,7 @@ class StakeMiner : public IStakeMiner { d->pwallet->m_last_coin_stake_search_interval = 0; LogPrintf("ThreadStakeMiner(): Ledger not connected with fingerprint %s\n", d->pwallet->m_ledger_id); + Sleep(10000); } return fConnected; From 8d94e9d65ac687a9045d772c3ab7b39df77f4b46 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 19 Apr 2021 14:33:32 +0200 Subject: [PATCH 119/164] Fix qtumledger start for Windows when use .py script --- src/qtum/qtumledger.cpp | 56 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/src/qtum/qtumledger.cpp b/src/qtum/qtumledger.cpp index e4d802666f..b4ed3a8dfa 100644 --- a/src/qtum/qtumledger.cpp +++ b/src/qtum/qtumledger.cpp @@ -4,9 +4,11 @@ #include #include #include +#include #include #include #include +#include #ifdef WIN32 #include #endif @@ -59,6 +61,21 @@ std::vector& operator<<(std::vector& os, const std::st return os; } +#ifdef WIN32 +// Check suffix +bool endsWith(const std::string& str, const std::string& suffix) +{ + return str.size() >= suffix.size() && 0 == str.compare(str.size()-suffix.size(), suffix.size(), suffix); +} + +// Check if the path is to python executable +bool isPyPath(const std::string& str) +{ + std::size_t found = str.find("python"); + return found!=std::string::npos; +} +#endif + // Start process from qtumd class CProcess { @@ -141,10 +158,45 @@ class QtumLedgerPriv { toolPath = gArgs.GetArg("-hwitoolpath", ""); toolExists = boost::filesystem::exists(toolPath); + initToolPath(); + if(gArgs.GetChainName() != CBaseChainParams::MAIN) { arguments << "--testnet"; } + + if(!toolExists) + { + LogPrintf("QtumLedger(): HWI tool not found %s\n", toolPath); + } + } + + void initToolPath() + { +#ifdef WIN32 + if(endsWith(toolPath, ".py") || + endsWith(toolPath, ".PY") || + endsWith(toolPath, ".Py") || + endsWith(toolPath, ".pY")) + { + arguments << toolPath; + toolPath = boost::process::search_path("python3").string(); + toolExists &= isPyPath(toolPath); + if(!toolExists) + { + std::string prog = boost::process::search_path("cmd").string(); + std::vector arg; + arg << "/c" << "python3" << "-c" << "import sys; print(sys.executable)"; + process.start(prog, arg); + process.waitForFinished(); + toolPath = process.readAllStandardOutput(); + boost::erase_all(toolPath, "\r"); + boost::erase_all(toolPath, "\n"); + toolExists = isPyPath(toolPath); + process.clean(); + } + } +#endif } std::atomic fStarted{false}; @@ -301,6 +353,10 @@ bool QtumLedger::isConnected(const std::string &fingerprint) bool QtumLedger::enumerate(std::vector &devices) { + // Check if tool exists + if(!toolExists()) + return false; + // Enumerate hardware wallet devices if(isStarted()) return false; From c39376f19311bf27299886f726564cee0bc0ec48 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 19 Apr 2021 15:32:38 +0200 Subject: [PATCH 120/164] Don't emit value changed in option dialog when the value is the same --- src/qt/bitcoinamountfield.cpp | 16 +++++++++++++++- src/qt/bitcoinamountfield.h | 3 +++ src/qt/optionsdialog.cpp | 2 ++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/qt/bitcoinamountfield.cpp b/src/qt/bitcoinamountfield.cpp index dca4241291..b9b814b20a 100644 --- a/src/qt/bitcoinamountfield.cpp +++ b/src/qt/bitcoinamountfield.cpp @@ -70,7 +70,10 @@ class AmountSpinBox: public QAbstractSpinBox void setValue(const CAmount& value) { CAmount val = qBound(m_min_amount, value, m_max_amount); - lineEdit()->setText(BitcoinUnits::format(currentUnit, val, false, BitcoinUnits::separatorAlways)); + QString strValue = BitcoinUnits::format(currentUnit, val, false, BitcoinUnits::separatorAlways); + if(!notifyAlways && strValue == lineEdit()->text()) + return; + lineEdit()->setText(strValue); Q_EMIT valueChanged(); } @@ -149,6 +152,11 @@ class AmountSpinBox: public QAbstractSpinBox return cachedMinimumSizeHint; } + void setNotifyAlways(bool value) + { + notifyAlways = value; + } + private: int currentUnit{BitcoinUnits::BTC}; CAmount singleStep{CAmount(100000)}; // satoshis @@ -156,6 +164,7 @@ class AmountSpinBox: public QAbstractSpinBox bool m_allow_empty{true}; CAmount m_min_amount{CAmount(0)}; CAmount m_max_amount{BitcoinUnits::maxMoney()}; + bool notifyAlways = true; /** * Parse a string into a number of base monetary units and @@ -343,3 +352,8 @@ void BitcoinAmountField::setSingleStep(const CAmount& step) { amount->setSingleStep(step); } + +void BitcoinAmountField::setNotifyAlways(bool value) +{ + amount->setNotifyAlways(value); +} diff --git a/src/qt/bitcoinamountfield.h b/src/qt/bitcoinamountfield.h index 2db6b65f2c..f04d03f33b 100644 --- a/src/qt/bitcoinamountfield.h +++ b/src/qt/bitcoinamountfield.h @@ -65,6 +65,9 @@ class BitcoinAmountField: public QWidget */ QWidget *setupTabChain(QWidget *prev); + /** Notify always for valueChanged when it the same*/ + void setNotifyAlways(bool value); + Q_SIGNALS: void valueChanged(); diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp index 9e5ef58867..5781812548 100644 --- a/src/qt/optionsdialog.cpp +++ b/src/qt/optionsdialog.cpp @@ -71,6 +71,8 @@ OptionsDialog::OptionsDialog(QWidget *parent, bool enableWallet) : ui->proxyPortTorLabel->setEnabled(false); ui->proxyPortTor->setValidator(new QIntValidator(1, 65535, this)); + ui->reserveBalance->setNotifyAlways(false); + connect(ui->connectSocks, &QPushButton::toggled, ui->proxyIp, &QWidget::setEnabled); connect(ui->connectSocks, &QPushButton::toggled, ui->proxyIpLabel, &QWidget::setEnabled); connect(ui->connectSocks, &QPushButton::toggled, ui->proxyPort, &QWidget::setEnabled); From 1a0d0555a5f88f73e86ad39a7f1019e8b708fa81 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Wed, 21 Apr 2021 14:43:17 +0200 Subject: [PATCH 121/164] Add cs_ledger lock --- src/qt/qtumhwitool.cpp | 8 ++++++++ src/qtum/qtumledger.cpp | 5 +++++ src/qtum/qtumledger.h | 3 +++ 3 files changed, 16 insertions(+) diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 96d4cada83..e8f7dd4d63 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -113,6 +114,7 @@ QtumHwiTool::~QtumHwiTool() bool QtumHwiTool::enumerate(QList &devices) { + LOCK(cs_ledger); // Enumerate hardware wallet devices if(isStarted()) return false; @@ -142,6 +144,7 @@ bool QtumHwiTool::isConnected(const QString &fingerprint) bool QtumHwiTool::getKeyPool(const QString &fingerprint, int type, QString &desc) { + LOCK(cs_ledger); // Get the key pool for a device if(isStarted()) return false; @@ -171,6 +174,7 @@ bool QtumHwiTool::getKeyPoolBech32(const QString &fingerprint, QString &desc) bool QtumHwiTool::signTx(const QString &fingerprint, QString &psbt) { + LOCK(cs_ledger); // Sign PSBT transaction if(isStarted()) return false; @@ -185,6 +189,7 @@ bool QtumHwiTool::signTx(const QString &fingerprint, QString &psbt) bool QtumHwiTool::signMessage(const QString &fingerprint, const QString &message, const QString &path, QString &signature) { + LOCK(cs_ledger); // Sign message if(isStarted()) return false; @@ -199,6 +204,7 @@ bool QtumHwiTool::signMessage(const QString &fingerprint, const QString &message bool QtumHwiTool::signDelegate(const QString &fingerprint, QString &psbt) { + LOCK(cs_ledger); if(!d->model) return false; // Get the delegation data to sign @@ -681,6 +687,7 @@ QString InstallDevice::parse(QString arg) bool QtumHwiTool::installApp(InstallDevice::DeviceType type) { + LOCK(cs_ledger); // Install Qtum App to ledger InstallDevice device(type); QString program; @@ -702,6 +709,7 @@ bool QtumHwiTool::installApp(InstallDevice::DeviceType type) bool QtumHwiTool::removeApp(InstallDevice::DeviceType type) { + LOCK(cs_ledger); // Remove Qtum App from ledger InstallDevice device(type); QString program; diff --git a/src/qtum/qtumledger.cpp b/src/qtum/qtumledger.cpp index b4ed3a8dfa..005a1b1ae2 100644 --- a/src/qtum/qtumledger.cpp +++ b/src/qtum/qtumledger.cpp @@ -13,6 +13,8 @@ #include #endif +RecursiveMutex cs_ledger; + namespace QtumLedger_NS { // Read json document UniValue json_read_doc(const std::string& jsondata) @@ -223,6 +225,7 @@ QtumLedger::~QtumLedger() bool QtumLedger::signCoinStake(const std::string &fingerprint, std::string &psbt) { + LOCK(cs_ledger); // Check if tool exists if(!toolExists()) return false; @@ -241,6 +244,7 @@ bool QtumLedger::signCoinStake(const std::string &fingerprint, std::string &psbt bool QtumLedger::signBlockHeader(const std::string &fingerprint, const std::string &header, const std::string &path, std::vector &vchSig) { + LOCK(cs_ledger); // Check if tool exists if(!toolExists()) return false; @@ -353,6 +357,7 @@ bool QtumLedger::isConnected(const std::string &fingerprint) bool QtumLedger::enumerate(std::vector &devices) { + LOCK(cs_ledger); // Check if tool exists if(!toolExists()) return false; diff --git a/src/qtum/qtumledger.h b/src/qtum/qtumledger.h index a0f6d812d2..eeedf31097 100644 --- a/src/qtum/qtumledger.h +++ b/src/qtum/qtumledger.h @@ -3,6 +3,9 @@ #include #include +#include + +extern RecursiveMutex cs_ledger; class QtumLedgerPriv; From 907cb9cf6b9ae74378dd461a674b0f10a9ac4a83 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 22 Apr 2021 13:22:05 +0200 Subject: [PATCH 122/164] Update qtum ledger to do all the communication with ledger app --- src/qt/qtumhwitool.cpp | 284 +++++++++------------------------------- src/qt/qtumhwitool.h | 6 - src/qtum/qtumledger.cpp | 242 ++++++++++++++++++++++++++-------- src/qtum/qtumledger.h | 39 ++++++ 4 files changed, 284 insertions(+), 287 deletions(-) diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index e8f7dd4d63..f3c214148a 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -39,9 +39,6 @@ class QtumHwiToolPriv public: QtumHwiToolPriv(QObject *parent) { - toolPath = GUIUtil::getHwiToolPath(); - initToolPath(); - QStringList optionalRescan = QStringList() << PARAM_START_HEIGHT << PARAM_STOP_HEIGHT; cmdRescan = new ExecRPCCommand("rescanblockchain", QStringList(), optionalRescan, QMap(), parent); QStringList mandatoryImport = QStringList() << PARAM_REQUESTS; @@ -52,29 +49,12 @@ class QtumHwiToolPriv cmdSend = new ExecRPCCommand("sendrawtransaction", mandatorySend, QStringList(), QMap(), parent); QStringList mandatoryDecode = QStringList() << PARAM_PSBT; cmdDecode = new ExecRPCCommand("decodepsbt", mandatoryDecode, QStringList(), QMap(), parent); - if(gArgs.GetChainName() != CBaseChainParams::MAIN) - { - arguments << "--testnet"; - } - } - - void initToolPath() - { -#ifdef WIN32 - if(toolPath.endsWith(".py", Qt::CaseInsensitive)) - { - arguments << toolPath; - toolPath = "python3"; - } -#endif } std::atomic fStarted{false}; QProcess process; QString strStdout; QString strError; - QString toolPath; - QStringList arguments; ExecRPCCommand* cmdRescan = 0; ExecRPCCommand* cmdImport = 0; @@ -102,6 +82,19 @@ QString HWDevice::errorMessage() const return QString("Error: %1\nCode: %2").arg(error, code); } +HWDevice toHWDevice(const LedgerDevice& device) +{ + HWDevice hwDevice; + hwDevice.fingerprint = QString::fromStdString(device.fingerprint); + hwDevice.serial_number = QString::fromStdString(device.serial_number); + hwDevice.type = QString::fromStdString(device.type); + hwDevice.path = QString::fromStdString(device.path); + hwDevice.error = QString::fromStdString(device.error); + hwDevice.model = QString::fromStdString(device.model); + hwDevice.code = QString::fromStdString(device.code); + return hwDevice; +} + QtumHwiTool::QtumHwiTool(QObject *parent) : QObject(parent) { d = new QtumHwiToolPriv(this); @@ -115,46 +108,47 @@ QtumHwiTool::~QtumHwiTool() bool QtumHwiTool::enumerate(QList &devices) { LOCK(cs_ledger); - // Enumerate hardware wallet devices - if(isStarted()) - return false; - - if(!beginEnumerate(devices)) - return false; - - wait(); + devices.clear(); + std::vector vecDevices; + if(QtumLedger::instance().enumerate(vecDevices)) + { + for(LedgerDevice device : vecDevices) + { + // Get device info + HWDevice hwDevice = toHWDevice(device); + devices.push_back(hwDevice); - return endEnumerate(devices); + // Set error message + if(!hwDevice.isValid()) + addError(hwDevice.errorMessage()); + } + } + d->strError = QString::fromStdString(QtumLedger::instance().errorMessage()); + return devices.size() > 0; } bool QtumHwiTool::isConnected(const QString &fingerprint) { - // Check if a device is connected - QList devices; - if(enumerate(devices)) - { - for(HWDevice device: devices) - { - if(device.fingerprint == fingerprint) - return true; - } - } - return false; + LOCK(cs_ledger); + std::string strFingerprint = fingerprint.toStdString(); + bool ret = QtumLedger::instance().isConnected(strFingerprint); + d->strError = QString::fromStdString(QtumLedger::instance().errorMessage()); + return ret; } bool QtumHwiTool::getKeyPool(const QString &fingerprint, int type, QString &desc) { LOCK(cs_ledger); - // Get the key pool for a device - if(isStarted()) - return false; - - if(!beginGetKeyPool(fingerprint, type, desc)) - return false; - - wait(); - - return endGetKeyPool(fingerprint, type, desc); + std::string strFingerprint = fingerprint.toStdString(); + std::string strDesc = desc.toStdString(); + bool ret = QtumLedger::instance().getKeyPool(strFingerprint, type, strDesc); + desc = QString::fromStdString(strDesc); + if(ret) + { + desc = "\"" + desc.replace("\"", "\\\"") + "\""; + } + d->strError = QString::fromStdString(QtumLedger::instance().errorMessage()); + return ret; } bool QtumHwiTool::getKeyPoolPKH(const QString &fingerprint, QString &desc) @@ -175,36 +169,29 @@ bool QtumHwiTool::getKeyPoolBech32(const QString &fingerprint, QString &desc) bool QtumHwiTool::signTx(const QString &fingerprint, QString &psbt) { LOCK(cs_ledger); - // Sign PSBT transaction - if(isStarted()) - return false; - - if(!beginSignTx(fingerprint, psbt)) - return false; - - wait(); - - return endSignTx(fingerprint, psbt); + std::string strFingerprint = fingerprint.toStdString(); + std::string strPsbt = psbt.toStdString(); + bool ret = QtumLedger::instance().signTx(strFingerprint, strPsbt); + psbt = QString::fromStdString(strPsbt); + d->strError = QString::fromStdString(QtumLedger::instance().errorMessage()); + return ret; } bool QtumHwiTool::signMessage(const QString &fingerprint, const QString &message, const QString &path, QString &signature) { LOCK(cs_ledger); - // Sign message - if(isStarted()) - return false; - - if(!beginSignMessage(fingerprint, message, path, signature)) - return false; - - wait(); - - return endSignMessage(fingerprint, message, path, signature); + std::string strFingerprint = fingerprint.toStdString(); + std::string strMessage = message.toStdString(); + std::string strPath = path.toStdString(); + std::string strSignature = signature.toStdString(); + bool ret = QtumLedger::instance().signMessage(strFingerprint, strMessage, strPath, strSignature); + signature = QString::fromStdString(strSignature); + d->strError = QString::fromStdString(QtumLedger::instance().errorMessage()); + return ret; } bool QtumHwiTool::signDelegate(const QString &fingerprint, QString &psbt) { - LOCK(cs_ledger); if(!d->model) return false; // Get the delegation data to sign @@ -281,157 +268,6 @@ void QtumHwiTool::wait() } } -bool QtumHwiTool::beginEnumerate(QList &devices) -{ - Q_UNUSED(devices); - - // Execute command line - QStringList arguments = d->arguments; - arguments << "enumerate"; - d->process.start(d->toolPath, arguments); - d->fStarted = true; - - return d->fStarted; -} - -bool QtumHwiTool::beginGetKeyPool(const QString &fingerprint, int type, QString &desc) -{ - Q_UNUSED(desc); - - // Get the output type - QString descType; - switch (type) { - case (int)OutputType::P2SH_SEGWIT: - descType = "--sh_wpkh"; - break; - case (int)OutputType::BECH32: - descType = "--wpkh"; - break; - default: - break; - } - - // Execute command line - QStringList arguments = d->arguments; - arguments << "-f" << fingerprint << "getkeypool"; - if(descType != "") - arguments << descType; - arguments << "0" << "1000"; - d->process.start(d->toolPath, arguments); - d->fStarted = true; - - return d->fStarted; -} - -bool QtumHwiTool::beginSignTx(const QString &fingerprint, QString &psbt) -{ - // Execute command line - QStringList arguments = d->arguments; - arguments << "-f" << fingerprint << "signtx" << psbt; - d->process.start(d->toolPath, arguments); - d->fStarted = true; - - return d->fStarted; -} - -bool QtumHwiTool::beginSignMessage(const QString &fingerprint, const QString &message, const QString &path, QString &signature) -{ - Q_UNUSED(signature); - - // Execute command line - QStringList arguments = d->arguments; - arguments << "-f" << fingerprint << "signmessage" << message << path; - d->process.start(d->toolPath, arguments); - d->fStarted = true; - - return d->fStarted; -} - -bool QtumHwiTool::endEnumerate(QList &devices) -{ - // Decode command line results - QJsonDocument jsonDocument = QJsonDocument::fromJson(d->strStdout.toUtf8()); - QJsonArray jsonDevices = jsonDocument.array(); - for(QJsonValue jsonDevice : jsonDevices) - { - if(!jsonDevice.isObject()) - return false; - - // Get device info - QVariantMap data = jsonDevice.toObject().toVariantMap(); - HWDevice device; - device.fingerprint = data["fingerprint"].toString(); - device.serial_number = data["serial_number"].toString(); - device.type = data["type"].toString(); - device.path = data["path"].toString(); - device.error = data["error"].toString(); - device.model = data["model"].toString(); - device.code = data["code"].toString(); - devices.push_back(device); - - // Set error message - if(!device.isValid()) - addError(device.errorMessage()); - } - - return devices.size() > 0; -} - -bool QtumHwiTool::endGetKeyPool(const QString &fingerprint, int type, QString &desc) -{ - Q_UNUSED(fingerprint); - Q_UNUSED(type); - - // Decode command line results - bool ret = d->strStdout.contains("desc"); - if(ret) - { - desc = "\"" + d->strStdout.replace("\"", "\\\"") + "\""; - } - else - { - desc = d->strStdout; - } - - return ret; -} - -bool QtumHwiTool::endSignTx(const QString &fingerprint, QString &psbt) -{ - Q_UNUSED(fingerprint); - - // Decode command line results - QJsonDocument jsonDocument = QJsonDocument::fromJson(d->strStdout.toUtf8()); - QVariantMap data = jsonDocument.object().toVariantMap(); - QString psbtSigned = data["psbt"].toString(); - if(!psbtSigned.isEmpty()) - { - psbt = psbtSigned; - return true; - } - - return false; -} - -bool QtumHwiTool::endSignMessage(const QString &fingerprint, const QString &message, const QString &path, QString &signature) -{ - Q_UNUSED(fingerprint); - Q_UNUSED(message); - Q_UNUSED(path); - - // Decode command line results - QJsonDocument jsonDocument = QJsonDocument::fromJson(d->strStdout.toUtf8()); - QVariantMap data = jsonDocument.object().toVariantMap(); - QString msgSigned = data["signature"].toString(); - if(!msgSigned.isEmpty()) - { - signature = msgSigned; - return true; - } - - return false; -} - bool QtumHwiTool::rescanBlockchain(int startHeight, int stopHeight) { if(!d->model) return false; @@ -687,7 +523,6 @@ QString InstallDevice::parse(QString arg) bool QtumHwiTool::installApp(InstallDevice::DeviceType type) { - LOCK(cs_ledger); // Install Qtum App to ledger InstallDevice device(type); QString program; @@ -695,6 +530,7 @@ bool QtumHwiTool::installApp(InstallDevice::DeviceType type) bool ret = device.loadCommand(program, arguments); if(ret) { + LOCK(cs_ledger); d->process.start(program, arguments); d->fStarted = true; @@ -709,7 +545,6 @@ bool QtumHwiTool::installApp(InstallDevice::DeviceType type) bool QtumHwiTool::removeApp(InstallDevice::DeviceType type) { - LOCK(cs_ledger); // Remove Qtum App from ledger InstallDevice device(type); QString program; @@ -717,6 +552,7 @@ bool QtumHwiTool::removeApp(InstallDevice::DeviceType type) bool ret = device.deleteCommand(program, arguments); if(ret) { + LOCK(cs_ledger); d->process.start(program, arguments); d->fStarted = true; diff --git a/src/qt/qtumhwitool.h b/src/qt/qtumhwitool.h index c8afc557e8..178477c4c0 100644 --- a/src/qt/qtumhwitool.h +++ b/src/qt/qtumhwitool.h @@ -270,14 +270,8 @@ public Q_SLOTS: bool isStarted(); void wait(); - bool beginEnumerate(QList& devices); bool beginGetKeyPool(const QString& fingerprint, int type, QString& desc); - bool beginSignTx(const QString& fingerprint, QString& psbt); - bool endEnumerate(QList& devices); bool endGetKeyPool(const QString& fingerprint, int type, QString& desc); - bool endSignTx(const QString& fingerprint, QString& psbt); - bool beginSignMessage(const QString& fingerprint, const QString& message, const QString& path, QString& signature); - bool endSignMessage(const QString& fingerprint, const QString& message, const QString& path, QString& signature); bool execRPC(ExecRPCCommand* cmd, const QMap& lstParams, QVariant& result, QString& resultJson); void addError(const QString& error); diff --git a/src/qtum/qtumledger.cpp b/src/qtum/qtumledger.cpp index 005a1b1ae2..f47a1fcde1 100644 --- a/src/qtum/qtumledger.cpp +++ b/src/qtum/qtumledger.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -98,20 +99,27 @@ class CProcess // Start and wait for it to finish void waitForFinished() { - boost::asio::io_service svc; - boost::asio::streambuf out, err; -#ifdef WIN32 - boost::process::child child(m_program, ::boost::process::windows::create_no_window, boost::process::args(m_arguments), - boost::process::std_out > out, boost::process::std_err > err, svc); -#else - boost::process::child child(m_program, boost::process::args(m_arguments), - boost::process::std_out > out, boost::process::std_err > err, svc); -#endif - - svc.run(); - child.wait(); - m_std_out = toString(&out); - m_std_err = toString(&err); + try + { + boost::asio::io_service svc; + boost::asio::streambuf out, err; + #ifdef WIN32 + boost::process::child child(m_program, ::boost::process::windows::create_no_window, boost::process::args(m_arguments), + boost::process::std_out > out, boost::process::std_err > err, svc); + #else + boost::process::child child(m_program, boost::process::args(m_arguments), + boost::process::std_out > out, boost::process::std_err > err, svc); + #endif + + svc.run(); + child.wait(); + m_std_out = toString(&out); + m_std_err = toString(&err); + } + catch(...) + { + m_std_err = "Fail to create process for: " + m_program; + } } // Read all standard output @@ -223,6 +231,12 @@ QtumLedger::~QtumLedger() d = 0; } +QtumLedger &QtumLedger::instance() +{ + static QtumLedger device; + return device; +} + bool QtumLedger::signCoinStake(const std::string &fingerprint, std::string &psbt) { LOCK(cs_ledger); @@ -261,6 +275,104 @@ bool QtumLedger::signBlockHeader(const std::string &fingerprint, const std::stri return endSignBlockHeader(fingerprint, header, path, vchSig); } +bool QtumLedger::isConnected(const std::string &fingerprint) +{ + // Check if a device is connected + std::vector devices; + if(enumerate(devices)) + { + for(LedgerDevice device: devices) + { + if(device.fingerprint == fingerprint) + return true; + } + } + + return false; +} + +bool QtumLedger::enumerate(std::vector &devices) +{ + LOCK(cs_ledger); + // Check if tool exists + if(!toolExists()) + return false; + + // Enumerate hardware wallet devices + if(isStarted()) + return false; + + if(!beginEnumerate(devices)) + return false; + + wait(); + + return endEnumerate(devices); +} + +bool QtumLedger::signTx(const std::string &fingerprint, std::string &psbt) +{ + LOCK(cs_ledger); + // Check if tool exists + if(!toolExists()) + return false; + + // Sign PSBT transaction + if(isStarted()) + return false; + + if(!beginSignTx(fingerprint, psbt)) + return false; + + wait(); + + return endSignTx(fingerprint, psbt); +} + +bool QtumLedger::signMessage(const std::string &fingerprint, const std::string &message, const std::string &path, std::string &signature) +{ + LOCK(cs_ledger); + // Check if tool exists + if(!toolExists()) + return false; + + // Sign message + if(isStarted()) + return false; + + if(!beginSignMessage(fingerprint, message, path, signature)) + return false; + + wait(); + + return endSignMessage(fingerprint, message, path, signature); +} + +bool QtumLedger::getKeyPool(const std::string &fingerprint, int type, std::string &desc) +{ + LOCK(cs_ledger); + // Check if tool exists + if(!toolExists()) + return false; + + // Get the key pool for a device + if(isStarted()) + return false; + + if(!beginGetKeyPool(fingerprint, type, desc)) + return false; + + wait(); + + return endGetKeyPool(fingerprint, type, desc); +} + +std::string QtumLedger::errorMessage() +{ + LOCK(cs_ledger); + return d->strError; +} + bool QtumLedger::toolExists() { return d->toolExists; @@ -334,46 +446,6 @@ bool QtumLedger::endSignBlockHeader(const std::string &, const std::string &, co return false; } -bool QtumLedger::isConnected(const std::string &fingerprint) -{ - // Check if a device is connected - try - { - std::vector devices; - if(enumerate(devices)) - { - for(LedgerDevice device: devices) - { - if(device.fingerprint == fingerprint) - return true; - } - } - } - catch(...) - {} - - return false; -} - -bool QtumLedger::enumerate(std::vector &devices) -{ - LOCK(cs_ledger); - // Check if tool exists - if(!toolExists()) - return false; - - // Enumerate hardware wallet devices - if(isStarted()) - return false; - - if(!beginEnumerate(devices)) - return false; - - wait(); - - return endEnumerate(devices); -} - bool QtumLedger::beginEnumerate(std::vector &) { // Execute command line @@ -412,8 +484,64 @@ bool QtumLedger::endEnumerate(std::vector &devices) return devices.size() > 0; } -QtumLedger &QtumLedger::instance() +bool QtumLedger::beginSignMessage(const std::string &fingerprint, const std::string &message, const std::string &path, std::string &) { - static QtumLedger device; - return device; + // Execute command line + std::vector arguments = d->arguments; + arguments << "-f" << fingerprint << "signmessage" << message << path; + d->process.start(d->toolPath, arguments); + d->fStarted = true; + + return d->fStarted; +} + +bool QtumLedger::endSignMessage(const std::string &, const std::string &, const std::string &, std::string &signature) +{ + // Decode command line results + UniValue jsonDocument = json_read_doc(d->strStdout); + UniValue data = json_get_object(jsonDocument); + std::string msgSigned = json_get_key_string(data, "signature"); + if(!msgSigned.empty()) + { + signature = msgSigned; + return true; + } + + return false; +} + +bool QtumLedger::beginGetKeyPool(const std::string &fingerprint, int type, std::string &) +{ + // Get the output type + std::string descType; + switch (type) { + case (int)OutputType::P2SH_SEGWIT: + descType = "--sh_wpkh"; + break; + case (int)OutputType::BECH32: + descType = "--wpkh"; + break; + default: + break; + } + + // Execute command line + std::vector arguments = d->arguments; + arguments << "-f" << fingerprint << "getkeypool"; + if(descType != "") + arguments << descType; + arguments << "0" << "1000"; + d->process.start(d->toolPath, arguments); + d->fStarted = true; + + return d->fStarted; } + +bool QtumLedger::endGetKeyPool(const std::string &, int , std::string &desc) +{ + // Decode command line results + bool ret = d->strStdout.find("desc")!=std::string::npos; + desc = d->strStdout; + return ret; +} + diff --git a/src/qtum/qtumledger.h b/src/qtum/qtumledger.h index eeedf31097..532ab42fc7 100644 --- a/src/qtum/qtumledger.h +++ b/src/qtum/qtumledger.h @@ -69,6 +69,39 @@ class QtumLedger { */ bool enumerate(std::vector& devices); + /** + * @brief signTx Sign PSBT transaction + * @param fingerprint Hardware wallet device fingerprint + * @param psbt In/Out PSBT transaction + * @return success of the operation + */ + bool signTx(const std::string& fingerprint, std::string& psbt); + + /** + * @brief signMessage Sign message + * @param fingerprint Hardware wallet device fingerprint + * @param message Message to sign + * @param path HD key path + * @param signature Signature of the message + * @return success of the operation + */ + bool signMessage(const std::string& fingerprint, const std::string& message, const std::string& path, std::string& signature); + + /** + * @brief getKeyPool Get the key pool for a device + * @param fingerprint Hardware wallet device fingerprint + * @param type Type of output + * @param desc Address descriptors + * @return success of the operation + */ + bool getKeyPool(const std::string& fingerprint, int type, std::string& desc); + + /** + * @brief errorMessage Get the last error message + * @return Last error message + */ + std::string errorMessage(); + static QtumLedger &instance(); private: @@ -85,6 +118,12 @@ class QtumLedger { bool beginEnumerate(std::vector& devices); bool endEnumerate(std::vector& devices); + bool beginSignMessage(const std::string& fingerprint, const std::string& message, const std::string& path, std::string &signature); + bool endSignMessage(const std::string& fingerprint, const std::string& message, const std::string& path, std::string &signature); + + bool beginGetKeyPool(const std::string& fingerprint, int type, std::string& desc); + bool endGetKeyPool(const std::string& fingerprint, int type, std::string& desc); + private: QtumLedger(const QtumLedger&); QtumLedger& operator=(const QtumLedger&); From 176eb116540532175a4d59b7cfb6855312adb978 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 22 Apr 2021 15:55:52 +0200 Subject: [PATCH 123/164] Start the hardware wallet for staking if the tool is found --- src/qt/hardwaresigntx.cpp | 2 +- src/qtum/qtumledger.h | 7 ++++++- src/wallet/wallet.cpp | 11 ++++++++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/qt/hardwaresigntx.cpp b/src/qt/hardwaresigntx.cpp index 8d503a24df..061b2f4865 100644 --- a/src/qt/hardwaresigntx.cpp +++ b/src/qt/hardwaresigntx.cpp @@ -33,7 +33,7 @@ bool HardwareSignTx::askDevice(bool stake, QString* pFingerprint) QString hwiToolPath = GUIUtil::getHwiToolPath(); if(!QFile::exists(hwiToolPath)) { - QMessageBox msgBox(widget); + QMessageBox msgBox; msgBox.setWindowTitle(tr("HWI tool not found")); msgBox.setTextFormat(Qt::RichText); msgBox.setText(tr("HWI tool not found at path \"%1\".
Please download it from %2 and add the path to the settings.").arg(hwiToolPath, QTUM_HWI_TOOL)); diff --git a/src/qtum/qtumledger.h b/src/qtum/qtumledger.h index 532ab42fc7..830fb903d0 100644 --- a/src/qtum/qtumledger.h +++ b/src/qtum/qtumledger.h @@ -102,10 +102,15 @@ class QtumLedger { */ std::string errorMessage(); + /** + * @brief toolExists Check if the hwi tool is accessible + * @return true: accessible, false: not accessible + */ + bool toolExists(); + static QtumLedger &instance(); private: - bool toolExists(); bool isStarted(); void wait(); diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 1b2ec3c941..68a8ba5cdf 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -5769,7 +5770,15 @@ void CWallet::StakeQtums(bool fStake, CConnman* connman) void CWallet::StartStake(CConnman *connman) { - m_enabled_staking = IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS) ? !m_ledger_id.empty() : true; + if(IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS)) + { + m_enabled_staking = !m_ledger_id.empty() && QtumLedger::instance().toolExists(); + } + else + { + m_enabled_staking = true; + } + StakeQtums(true, connman); } From d94fc97bf19eb562dacc4b74a2abe0aafea8ec0c Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 23 Apr 2021 10:22:55 +0200 Subject: [PATCH 124/164] Log error if fail to sign block with ledger --- src/qt/qtumhwitool.cpp | 17 ++++++++++++----- src/qtum/qtumledger.cpp | 32 +++++++++++++++++++++++++++++++- src/validation.cpp | 14 +++++++++++++- 3 files changed, 56 insertions(+), 7 deletions(-) diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index f3c214148a..4f50eed339 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -123,7 +123,11 @@ bool QtumHwiTool::enumerate(QList &devices) addError(hwDevice.errorMessage()); } } - d->strError = QString::fromStdString(QtumLedger::instance().errorMessage()); + else + { + d->strError = QString::fromStdString(QtumLedger::instance().errorMessage()); + } + return devices.size() > 0; } @@ -132,7 +136,7 @@ bool QtumHwiTool::isConnected(const QString &fingerprint) LOCK(cs_ledger); std::string strFingerprint = fingerprint.toStdString(); bool ret = QtumLedger::instance().isConnected(strFingerprint); - d->strError = QString::fromStdString(QtumLedger::instance().errorMessage()); + if(!ret) d->strError = QString::fromStdString(QtumLedger::instance().errorMessage()); return ret; } @@ -147,7 +151,10 @@ bool QtumHwiTool::getKeyPool(const QString &fingerprint, int type, QString &desc { desc = "\"" + desc.replace("\"", "\\\"") + "\""; } - d->strError = QString::fromStdString(QtumLedger::instance().errorMessage()); + else + { + d->strError = QString::fromStdString(QtumLedger::instance().errorMessage()); + } return ret; } @@ -173,7 +180,7 @@ bool QtumHwiTool::signTx(const QString &fingerprint, QString &psbt) std::string strPsbt = psbt.toStdString(); bool ret = QtumLedger::instance().signTx(strFingerprint, strPsbt); psbt = QString::fromStdString(strPsbt); - d->strError = QString::fromStdString(QtumLedger::instance().errorMessage()); + if(!ret) d->strError = QString::fromStdString(QtumLedger::instance().errorMessage()); return ret; } @@ -186,7 +193,7 @@ bool QtumHwiTool::signMessage(const QString &fingerprint, const QString &message std::string strSignature = signature.toStdString(); bool ret = QtumLedger::instance().signMessage(strFingerprint, strMessage, strPath, strSignature); signature = QString::fromStdString(strSignature); - d->strError = QString::fromStdString(QtumLedger::instance().errorMessage()); + if(!ret) d->strError = QString::fromStdString(QtumLedger::instance().errorMessage()); return ret; } diff --git a/src/qtum/qtumledger.cpp b/src/qtum/qtumledger.cpp index f47a1fcde1..15b57bd656 100644 --- a/src/qtum/qtumledger.cpp +++ b/src/qtum/qtumledger.cpp @@ -57,6 +57,20 @@ std::string json_get_key_string(const UniValue& jsondata, std::string key) return v.get_str(); } +// Get json int for key +int json_get_key_int(const UniValue& jsondata, std::string key) +{ + UniValue v(0); + if(jsondata.exists(key)) + { + UniValue data = jsondata[key]; + if(data.isNum()) + v = data; + } + + return v.get_int(); +} + // Append data to vector std::vector& operator<<(std::vector& os, const std::string& dt) { @@ -370,7 +384,23 @@ bool QtumLedger::getKeyPool(const std::string &fingerprint, int type, std::strin std::string QtumLedger::errorMessage() { LOCK(cs_ledger); - return d->strError; + if(d->strError.empty() == false) + return d->strError; + if(d->strStdout.empty() == false) + { + try + { + UniValue jsonDocument = json_read_doc(d->strStdout); + UniValue data = json_get_object(jsonDocument); + std::string error = json_get_key_string(data, "error"); + int code = json_get_key_int(data, "code"); + if(data.exists("error") || data.exists("code")) + return strprintf("Error: %s, Code: %d", error, code); + } + catch(...) + {} + } + return "unknown error"; } bool QtumLedger::toolExists() diff --git a/src/validation.cpp b/src/validation.cpp index 373d4746fd..18ec469649 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -4827,6 +4827,18 @@ bool SignBlockHWI(std::shared_ptr pblock, CWallet& wallet, std::vector pblock, CWallet& wallet, std::vector& vchSig) +{ + LOCK(cs_ledger); + bool ret = SignBlockHWI(pblock, wallet, vchSig); + if(!ret) + { + std::string errorMessage = QtumLedger::instance().errorMessage(); + LogPrintf("WARN: %s: fail to sign block (%s)\n", __func__, errorMessage); + } + return ret; +} + // novacoin: attempt to generate suitable proof-of-stake bool SignBlock(std::shared_ptr pblock, CWallet& wallet, const CAmount& nTotalFees, uint32_t nTime, std::set >& setCoins, std::vector& setSelectedCoins, std::vector& setDelegateCoins, bool selectedOnly, bool tryOnly) { @@ -4887,7 +4899,7 @@ bool SignBlock(std::shared_ptr pblock, CWallet& wallet, const CAmount& n // append a signature to our block and ensure that is compact std::vector vchSig; - bool isSigned = privateKeysDisabled ? SignBlockHWI(pblock, wallet, vchSig) : key.SignCompact(pblock->GetHashWithoutSign(), vchSig); + bool isSigned = privateKeysDisabled ? SignBlockLedger(pblock, wallet, vchSig) : key.SignCompact(pblock->GetHashWithoutSign(), vchSig); pblock->SetBlockSignature(vchSig); // check block header From 74051a0d29556d7758b4436cdd449202112c7b93 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 23 Apr 2021 15:56:36 +0200 Subject: [PATCH 125/164] Update nanos stake app bin --- src/qt/res/ledger/nanos_stake_app.hex | 4604 +++++++++++++------------ 1 file changed, 2310 insertions(+), 2294 deletions(-) mode change 100644 => 100755 src/qt/res/ledger/nanos_stake_app.hex diff --git a/src/qt/res/ledger/nanos_stake_app.hex b/src/qt/res/ledger/nanos_stake_app.hex old mode 100644 new mode 100755 index 5271731c11..3f6c19ced3 --- a/src/qt/res/ledger/nanos_stake_app.hex +++ b/src/qt/res/ledger/nanos_stake_app.hex @@ -1,102 +1,102 @@ :02000004C0D06A -:1000000010B5044662B604F04BFD002C0DD0012063 +:1000000010B5044662B604F0CDFD002C0DD00120E1 :1000100000022168814205D1606801280AD1A068E8 -:10002000002803D104F00CFC02E0002004F02CFCBA -:10003000002010BD204604F0A9FCF0B581B00446B4 +:10002000002803D104F08EFC02E0002004F0AEFCB6 +:10003000002010BD204604F02BFDF0B581B0044631 :100040000020002A1CD00B780A2B19D89D0001260D :100050003543954214D82370002B10D00096271DED -:100060004D1C002601210022284602F003FA01C798 +:100060004D1C002601210022284602F03BFA01C760 :100070002D1D761C20788642F4D3009800E030468F :1000800001B0F0BDF0B58DB04A484B4C0027275267 -:100090004120C0000090275401AE304608F00CFD0E +:100090004120C0000090275401AE304608F08EFD8C :1000A0000546B585A8B2002812D0102877D001A83F -:1000B00087850B9805F0ECFE02203E4960524048CF -:1000C0006F21017045700121204602F049FD58E082 -:1000D00001A805F0DDFE0B90208802F048FD207895 +:1000B00087850B9805F06EFF02203E49605240484C +:1000C0006F21017045700121204602F0CBFD58E000 +:1000D00001A805F05FFF0B90208802F0CAFD207890 :1000E000002802D03548334D2FE0354A5078137838 :1000F0000021364D7D44364E7E446F5CBB4202D1BA :10010000775CB8420AD0491C0D29F6D36D20000255 :10011000CBB20D210D2B274D01D116E0254D2D48D9 :100120007844405C002809D08120830067200002C9 :100130001279002A09D0E25A052A06D088002649F9 -:100140007944085805F0EAFB80471E496052252192 +:100140007944085805F06CFC80471E49605225210F :100150004901615C00290CD0009BE15CEF220A4060 :10016000E25409210903884203D05D21164A012384 :100170005354615B020A124B5A545A185070881C2F -:10018000605305F079FE01A9884202D10B9805F071 -:100190007FFE01A8808D002809D10DB0F0BD01A817 -:1001A00087850B9805F074FE102004F0B3FC04F072 -:1001B000B1FCC046060200007C180020AA6F0000B7 -:1001C000E81F00200A02000000180020068C000032 -:1001D0000F8C0000F48B0000E48B0000F0B581B0C0 -:1001E00018480024FF22214604F075FC41200090AD +:10018000605305F0FBFE01A9884202D10B9805F0EF +:1001900001FF01A8808D002809D10DB0F0BD01A894 +:1001A00087850B9805F0F6FE102004F035FD04F06D +:1001B00033FDC046060200007C180020AA6F000034 +:1001C000E81F00200A020000001800200A8D00002D +:1001D000138D0000F88C0000E88C0000F0B581B0B1 +:1001E00018480024FF22214604F0F7FC412000902B :1001F000C600154FBC5515483C525D241448015D9E :10020000B85D252255017A5D002A06D0002904D068 :10021000202108430099C90078540C49795A04F008 -:10022000C3FE812189007852785D002806D00848F5 -:10023000005D002802D0002005F0EAFDFFF722FF54 +:1002200045FF812189007852785D002806D0084872 +:10023000005D002802D0002005F06CFEFFF722FFD1 :10024000DBE7C046E81F00207C1800200602000003 :1002500000180020F0B581B0304C7C44204605F0F9 -:100260005DFB808802F083FC204605F057FB808808 -:10027000C0B2254CFF2843D02948784405F04EFBF6 +:10026000DFFB808802F005FD204605F0D9FB808881 +:10027000C0B2254CFF2843D02948784405F0D0FB74 :100280008088FF2108423BD0204804680546A088AA :100290001F4F7870000A3870E088F870000AB87054 -:1002A000207A38710934204608F028FC02467A7119 -:1002B000B81D214604F0F9FB2C682046093008F0EF -:1002C0001DFC0546AE1D2734204608F017FCF1B290 -:1002D0007854EE1DF0B23D18204608F00FFC02469F -:1002E0002846214604F0E1FB08480068273008F062 -:1002F00005FC8019C0B20749074A5052092004037F +:1002A000207A38710934204608F0AAFC02467A7197 +:1002B000B81D214604F07BFC2C682046093008F06C +:1002C0009FFC0546AE1D2734204608F099FCF1B28C +:1002D0007854EE1DF0B23D18204608F091FC02461D +:1002E0002846214604F063FC08480068273008F0DF +:1002F00087FC8019C0B20749074A505209200403FD :10030000204601B0F0BDC04685690000201D0020D8 -:10031000E81F0020060200007C180020629A0000FE -:10032000429A000010B51148784405F0F7FA807938 +:10031000E81F0020060200007C180020629B0000FD +:10032000429B000010B51148784405F079FB8079B4 :100330000B490C4A082353520B4930224A700122C0 :100340008A700523CB7003230B714A7100248C71D2 :10035000CB7110401B2242400A700920000310BDDF -:10036000060200007C180020E81F0020949900007D -:10037000B0B51A4C7C44204605F0D0FA808802F0D3 -:10038000F6FB204605F0CAFA8088C0B20F4CFF2861 -:1003900019D01348784405F0C1FA8088FF2108423B +:10036000060200007C180020E81F0020949A00007C +:10037000B0B51A4C7C44204605F052FB808802F050 +:1003800078FC204605F04CFB8088C0B20F4CFF285B +:1003900019D01348784405F043FB8088FF210842B8 :1003A00011D06B2004020A4DA87800280BD10D480B -:1003B000784405F0B3FA80880649074A012353526E +:1003B000784405F035FB80880649074A01235352EB :1003C0002870092004032046B0BDC046856900009E -:1003D000E81F0020060200007C1800204899000059 -:1003E000289900000C99000010B50720C0430A4965 +:1003D000E81F0020060200007C180020489A000058 +:1003E000289A00000C9A000010B50720C0430A4963 :1003F0000979002900D00846C4B267200002F82C11 -:1004000008D80548214605F0F7FB044804490C527A +:1004000008D80548214605F079FC044804490C52F7 :100410000920000310BDC046E81F002006020000AE :100420007C180020F0B585B0524E3779564D7D448A -:10043000284605F073FA808802F099FB284605F0FB -:100440006DFA8088C0B24C4C042800D98CE001259C +:10043000284605F0F5FA808802F01BFC284605F0F6 +:10044000EFFA8088C0B24C4C042800D98CE001251A :10045000294681401620014200D185E00497B178F9 :100460006B200702002080291ED000297FD1701D3B -:1004700000262946324601F0FDFF6A023F498850B6 +:1004700000262946324602F035F86A023F49885084 :100480007F2080000E5428020D543D20C0000E54E1 :100490003B480E547B2080000E541F2000010E505C :1004A0000E75CE77334E0420F178002935465ED1A3 :1004B0000499091A7D229200304FB9542818401D22 -:1004C0003F21C90078500126304602F015FC092072 +:1004C0003F21C90078500126304602F097FC0920F0 :1004D0000203387D082849D100233B757F20800026 :1004E0003946385CFB340028274640D02024684633 :1004F0001F462B463033029318C008462830314639 -:1005000004923A463B4605F085FB082103912846B4 -:1005100005F072FB322028706F702A1D029F38464A -:100520002146234605F0A2FB7002144E315828469E -:10053000243002F032F92846283031461531039A2A -:1005400004F0B3FA1148784405F0E8F969460F6001 -:100550004C600830302321462A4605F097FB0948B5 +:1005000004923A463B4605F007FC08210391284631 +:1005100005F0F4FB322028706F702A1D029F3846C8 +:100520002146234605F024FC7002144E315828461B +:10053000243002F0B4F92846283031461531039AA8 +:1005400004F035FB1148784405F06AFA69460F60FB +:100550004C600830302321462A4605F019FC094832 :1005600038213152049F02E0274600E01746B8B216 :1005700005B0F0BDE81F0020856900007C18002050 -:100580008E040000060200008E980000769700009E +:100580008E040000060200008E990000769800009C :10059000F0B59FB014460E4602AD69460D600121CC -:1005A00015AF1A463B4602F078F908354127002E70 -:1005B00003D1284601F01EFD21274122204629466D -:1005C00004F073FA38461FB0F0BD0000F0B59DB0DE -:1005D000C44E7E44304605F0A1F98579BB4CA07825 -:1005E0000D90304605F09AF92927C05D0126354067 +:1005A00015AF1A463B4602F0FAF908354127002EEE +:1005B00003D1284601F056FD212741222046294635 +:1005C00004F0F5FA38461FB0F0BD0000F0B59DB05C +:1005D000C44E7E44304605F023FA8579BB4CA078A2 +:1005E0000D90304605F01CFA2927C05D01263540E4 :1005F0000B95002500282A460AD0A07802282A4612 :1006000006D1B348817901220020072900D0024693 -:100610000C92B548784405F081F9C05D0D9B012B23 +:100610000C92B548784405F003FAC05D0D9B012BA0 :1006200029460DD00C990029294609D100282946D0 :1006300006D0A74881790020072900D00646314618 :100640000A910127012B384600D12846252149016E @@ -106,46 +106,46 @@ :1006800096480068406B002807D11CE19348006839 :100690004021405C022800D015E167200502207946 :1006A000002800D10FE1012B099202D1601D04F056 -:1006B00069F808900C98002809D060798000801DA6 -:1006C000C0B220180121002201F0D4FE1C90874DF9 -:1006D0007D44284605F022F9808802F048FA284631 -:1006E00005F01CF97C49CD1C8088C0B2042800D9D3 +:1006B000EBF808900C98002809D060798000801D24 +:1006C000C0B220180121002201F00CFF1C90874DC0 +:1006D0007D44284605F0A4F9808802F0CAFA28462D +:1006E00005F09EF97C49CD1C8088C0B2042800D951 :1006F000E9E0012181401620014200D1E3E005F04C -:100700004BFBAA28744D00D0DDE0651D2846394614 -:1007100002F05CF90790412006902070671C14AB32 +:10070000CDFBAA28744D00D0DDE0651D2846394692 +:1007100002F0DEF90790412006902070671C14ABB0 :1007200028460B993A46FFF733FF099B0546012BF4 :1007300014D0032B10D1E9B20EAD38462A4602F090 -:1007400034F80020694608602246433214213223DF -:10075000284602F0F7FF43E0022B34D10EA8142103 +:10074000B6F800206946086022464332142132235D +:10075000284603F079F843E0022B34D10EA8142187 :1007600004914170002105910170E9B2821C384664 -:100770001F46039202F019F858480068022F17D15B -:10078000049F406B00282CD005F0C8F8014668464D -:1007900007602746433700223846039B05F086F959 -:1007A0000546E8B201281CD1384608F0A7F917E041 +:100770001F46039202F09BF858480068022F17D1D9 +:10078000049F406B00282CD005F04AF901466846CA +:1007900007602746433700223846039B05F008FAD6 +:1007A0000546E8B201281CD1384608F029FA17E0BE :1007B000C0886946086005984860224643320EA802 :1007C000162196230AE045480068808800216A4681 -:1007D00003C2E9B2224643329623384602F014F8A7 +:1007D00003C2E9B2224643329623384602F096F825 :1007E0000546422025540B98002801D10420607052 -:1007F000EFB2E5192846433014A9202204F055F938 +:1007F000EFB2E5192846433014A9202204F0D7F9B6 :10080000384663303649334B58520D98012830D062 :10081000079800282DD00C98002847D02425585D33 -:10082000002808D0194620311CA8042204F05CF9E5 +:10082000002808D0194620311CA8042204F0DEF963 :10083000284B00283AD000265E55184620301CA9C7 -:1008400004221F4604F031F91C9B2046C8300925BC -:10085000274A7A44294604F08DFED0202654069873 -:10086000C000395C10220A433A5403F0ABFF2D0359 +:1008400004221F4604F0B3F91C9B2046C83009253A +:10085000274A7A44294604F00FFFD02026540698F0 +:10086000C000395C10220A433A5404F02DF82D03DD :1008700029E00D95322F354625D82046C83043341F -:1008800021463A461C4604F010F9C82000210D9A72 +:1008800021463A461C4604F092F9C82000210D9AF0 :1008900011540698C000215C10220A432254089883 -:1008A000C0B203F07DFF092005030CE00920050319 +:1008A000C0B203F0FFFF092005030CE00920050397 :1008B0000A98002807D00698C000195C10220A4345 -:1008C0001A5403F089FFA8B21DB0F0BDE81F002044 +:1008C0001A5404F00BF8A8B21DB0F0BDE81F0020C8 :1008D0003C2100207C18002082690000201D00209F -:1008E00006020000EA960000A8960000EC950000C1 -:1008F000F6830000B0B5692300218522002807D0C7 +:1008E00006020000EA970000A8970000EC960000BE +:1008F000FA840000B0B5692300218522002807D0C2 :100900000C480D49085A0D4941180B32002001E0EE :1009100010461A468BB20A4CE2548A1C054B064D0F -:10092000EA52491C89B2605491B2202004F03CFB89 +:10092000EA52491C89B2605491B2202004F0BEFB07 :10093000B0BDC046060200007C180020FEFF00008B :10094000E81F0020F0B593B00920C701C24D002672 :10095000EE51C24C285D02281FD0012800D078E15A @@ -155,29 +155,29 @@ :10099000285C00020843032235E0B14C295B092999 :1009A00000D23AE1AF4BE85CFD22FC2801D80922D5 :1009B0000EE0904200D04CE10B2900D22DE1AA4874 -:1009C000281800210A4601F031FDA64B295B0B22B5 +:1009C000281800210A4601F069FDA64B295B0B227D :1009D0001018884200D920E10A9000200126A3497E :1009E0002A18525C401C002A21D100240728F7D97C :1009F0002BE0052900D210E1A348281800210A465F -:100A000001F038FD0522E851022129558F21C90046 +:100A000001F070FD0522E851022129558F21C9000E :100A10006850964828188118914C16462A5B921BFC -:100A200004F043F8285B801B28530126F5E0691881 -:100A300011AC0822204601F026FF8D4828180146F7 -:100A4000224602F09DF8874B34460497EF1838464B -:100A500001F0FAFD0590384601F0C4FB07903846D6 -:100A600001F0F8FB02908348006840210391405C4C +:100A200004F0C5F8285B801B28530126F5E06918FF +:100A300011AC0822204601F0A8FF8D482818014675 +:100A4000224602F01FF9874B34460497EF183846C8 +:100A500001F032FE0590384601F0FCFB0790384665 +:100A600001F030FC02908348006840210391405C13 :100A7000002111280891099108460FD17B2081009F -:100A80000691384601F002FE09903846069901F0B9 -:100A900035FE08903846069901F035FE019038463B -:100AA00001F0FAFB1F2211010691695802290ED8A4 -:100AB00000920390384601F047FB0799084300284D +:100A80000691384601F03AFE09903846069901F081 +:100A90006DFE08903846069901F06DFE01903846CB +:100AA00001F032FC1F2211010691695802290ED86B +:100AB00000920390384601F07FFB07990843002815 :100AC0000A9A3AD006982858012852D8C1E06948B5 :100AD00000680399405C11280A9A07993B4614D193 -:100AE00018461F4601F030FB3B4607990A9A084317 +:100AE00018461F4601F068FB3B4607990A9A0843DF :100AF00000280AD10898099B1843002C01D1059BB6 :100B0000184300283B4600D1A3E05A480068039FE1 :100B1000C05D11282DD001200021059A002A00D0A7 -:100B200008460443184601F00FFB07990843012CBF +:100B200008460443184601F047FB07990843012C87 :100B30000A9A1ED100281CD18BE00898099B184303 :100B4000002C06D00028BDD106982858002807D1CF :100B50007FE0059B18430028B4D100980001285875 @@ -186,77 +186,77 @@ :100B8000049F3FD13C48285C00283BD0029B0B438C :100B900004240320002B00D00446019808430028B9 :100BA0000CD136482918E0B228182E4A8018142291 -:100BB00003F09AFF07990A9A002838D03D20C00018 +:100BB00004F01CF807990A9A002838D03D20C0009C :100BC00000291FD0285C00281CD009940BAC1422EB :100BD000089262700020207028482918A01C03F099 -:100BE00064FF16212046224601F0DFFD0998C0B2BD -:100BF00028181C4940182146089A03F075FF002860 +:100BE000E6FF16212046224601F061FE0998C0B2B8 +:100BF00028181C4940182146089A03F0F7FF0028DE :100C00000ED00A9A06996858401C6850EA51412053 :100C1000C000295C10220A432A54304613B0F0BDAC :100C2000144800684421405C400712D50A9A1448D1 :100C3000295C00290DD10121295406996858401CCE :100C400068508F20C0002958491E2950002AE4D03E -:100C5000DFE6012003F05EFF7C1800208404000022 +:100C5000DFE6012003F0E0FF7C18002084040000A0 :100C6000760400008A0200008B020000820200006D :100C700085040000201D00207E0200006A020000A2 :100C80008D0400007C0400008302000070B59EB05B :100C90000C4601AD69460D600126002214AB3146B9 -:100CA00001F0FBFD0948784404F038FE08358179ED -:100CB0004120314203D1284601F09CF9212081B224 -:100CC0002846224601F071FD1EB070BD169000004E +:100CA00001F07DFE0948784404F0BAFE08358179E8 +:100CB0004120314203D1284601F0D4F9212081B2EC +:100CC0002846224601F0F3FD1EB070BD16910000CB :100CD000F0B59FB0DE4A94786B210E021179002C9A :100CE00004D0FF2C02D0802C00D098E10A90D94B80 :100CF000D94F3D20C0000990385C0025002806919E :100D000012D0F85C00280FD150790125FD21FD2873 :100D10000AD34A1CD5B205220023A84200D01A46A5 -:100D20000325884200D015460BAE304607F0C4FEBE +:100D20000325884200D015460BAE304607F046FF3B :100D3000B085CA49084208D00BA8002181851598C2 -:100D400005F0A6F86F20060246E10BA805F0A0F812 +:100D400005F028F96F20060246E10BA805F022F90C :100D50001590387DC24E092800D03AE10221C843DF :100D6000801CC0B2844240D1787F002800D11CE1B1 :100D70000520C401385D002800D12AE10025582251 -:100D80000A98294603F0A7FEB1494879002800D106 -:100D90000BE10A9E2336491D2922304603F085FEC9 +:100D80000A98294603F029FFB1494879002800D183 +:100D90000BE10A9E2336491D2922304603F007FF46 :100DA000B64839183046FFF771FF3D55B04801216C -:100DB000395434463046AA4D01F0B6FD002800D122 +:100DB000395434463046AA4D01F038FE002800D19F :100DC000F3E025204001385C00282E4600D000E1E9 :100DD000A648042139544120C000395C10220A433E -:100DE0003A54204603F002FDDFE00791F520400071 +:100DE0003A54204603F084FDDFE00791F5204000EF :100DF0000890385C002813D1E8B206990B1A3446E3 :100E0000FB36002B00DAE4E000216A4611605160F5 -:100E10008F4A1018421D3846283004F0FBFE264643 +:100E10008F4A1018421D3846283004F07DFF2646C0 :100E2000787F00282FD08F4C385B069D4119FB3608 :100E30007D229200914200D9CBE038188A494018AF -:100E40008349491D2A4603F030FE385B4019385368 +:100E40008349491D2A4603F0B2FE385B40193853E6 :100E5000FFF778FD002804D04120C000385CC006B0 :100E6000F6D58F20C000385800287D4E0BD1412088 :100E7000C100795C1022114205D17C4B0324FC5443 :100E80001143C00039540998385C714A917800299F :100E900024D0002811D120206946486017A8086096 -:100EA000384694306A494A1D0121069B04F0B2FE7F +:100EA000384694306A494A1D0121069B04F034FFFC :100EB00067490998385C002850D00898385C0028A9 :100EC00022D020206946486017A80860172000013A :100ED0003A1838469430012160233CE000280BD1B9 :100EE000002168460160416038469430584A521DDE -:100EF000069B04F08FFE564A5F480121395255483F +:100EF000069B04F011FF564A5F48012139525548BC :100F000039540020107050E0202468461B2109014C :100F1000791801600A46039244603D462835012154 -:100F2000049100230593284604F074FE284604F03B -:100F300091FE6846039A14C02846049D294623461C -:100F400004F068FE6846446017A901603846943092 -:100F50003F4A2946059B04F05DFE3D49787F002805 +:100F2000049100230593284604F0F6FE284604F0B9 +:100F300013FF6846039A14C02846049D2946234699 +:100F400004F0EAFE6846446017A901603846943010 +:100F50003F4A2946059B04F0DFFE3D49787F002883 :100F600029D04348385C002804D1002158220A982F -:100F700003F0B1FD3F48006801790A9C61708079F7 -:100F8000A07020464C30082104F036FE3A480799FC +:100F700003F033FE3F48006801790A9C6170807974 +:100F8000A07020464C30082104F0B8FE3A4807997A :100F9000395200202E4908704870787F002811D0FF -:100FA000E01C17A9202203F080FD159804F070FFC3 +:100FA000E01C17A9202203F002FE159804F0F2FFBE :100FB0000920060333E03048079A3A52002048706F -:100FC00008700A9CE11C17A8202201F0D7FB00281A -:100FD00028D0159804F05CFF274C00203853387552 -:100FE000204D7A5B20483918194803F05EFD785B84 -:100FF000385304F041FF0BA9884202D1159804F040 -:1010000047FF1A4801213954164800243C521C4815 -:1010100038180822214603F05EFD1A483C54B0B24D +:100FC00008700A9CE11C17A8202201F059FC002897 +:100FD00028D0159804F0DEFF274C002038533875D0 +:100FE000204D7A5B20483918194803F0E0FD785B02 +:100FF000385304F0C3FF0BA9884202D1159804F0BE +:10100000C9FF1A4801213954164800243C521C4893 +:1010100038180822214603F0E0FD1A483C54B0B2CB :101020001FB0F0BD0898385C7B218900795C0143D2 :1010300009983A5C0A20002A05D0090603D101204C :10104000089978540020387509200603D1E7C04676 @@ -266,37 +266,37 @@ :10108000850400008D04000070B521200001134D7F :101090002818FFF71DFE04464120C600A85DC006C3 :1010A00019D50F48295C042904D0032905D103F080 -:1010B00029FB04E0012129540DE003F0FDFA00288A +:1010B000ABFB04E0012129540DE003F07FFB002885 :1010C00009D1084800212952A85DEF220240AA5503 :1010D0002975D520C401204670BDC0467C1800206B :1010E0008404000006020000F0B581B08F20C70024 :1010F0003D4DE8593D4C295D022901D1401EE85182 :1011000009210E030028009629D039482818CE015D -:10111000AA598118374C2B5B9A1A03F0C6FCA859C0 +:10111000AA598118374C2B5B9A1A03F048FDA8593D :10112000295B081A28534120C600A85DEF21014021 :10113000A955FFF707FC002802D0A85DC006F8D526 -:10114000A85DC006009E294C09D503F0B5FA0146FA +:10114000A85DC006009E294C09D503F037FB014677 :101150000120002945D100202875D520C601295D30 :1011600002290AD1E859002807D10320285503F0A5 -:10117000C9FA002807D0295D0AE0320A0020009B46 +:101170004BFB002807D0295D0AE0320A0020009BC3 :101180009E420CD12DE0002129552975D520C6019C :1011900001200022009B9E4200D01046320A164FCA :1011A000EB5B164CE2549A1CEA535B1C9BB2E65470 :1011B000002801D003290FD101200C4968540D48A3 -:1011C00000242C520E4828180822214603F083FCE4 -:1011D0000C482C5408482A5A91B2202003F0E4FE0F +:1011C00000242C520E4828180822214603F005FD61 +:1011D0000C482C5408482A5A91B2202003F066FF8C :1011E000002001B0F0BDC0467C180020840400003F :1011F000820200007604000006020000E81F0020C2 :10120000850400008D040000F0B585B0744D2F7981 -:101210007C4C7C44204604F081FB808801F0A7FCD4 -:10122000204604F07BFB6F4EF21C8088C0B204287D +:101210007C4C7C44204604F003FC808801F029FDCE +:10122000204604F0FDFB6F4EF21C8088C0B20428FB :1012300000D9D2E0049701273946814016200142A7 :1012400000D1CAE0A878684A7632802808D0002801 :1012500000D0C2E03902654B03245C5400211975AB :10126000EC788023052C59D8012C57D0002874D154 :10127000581CC1B200208C4200D00746A01E02902C :101280005A48407F002803930CD118462A30C0B238 -:101290000090019104F080FD0199009A904232463D +:101290000090019104F002FE0199009A90423246BA :1012A00000D09AE07B208000504A13461F541F2034 :1012B000000100221A5001208C4201461E4600D037 :1012C0001146029BDBB2042B034600D3134619439D @@ -307,2209 +307,2225 @@ :10131000052808D004280AD1012005E0802C1CD023 :10132000812CA3D059E00220324A304988543348F6 :1013300000242E4F3C54F52040003C5430483818CF -:101340001822214603F0C7FBEC36BC550520C0012E +:101340001822214603F049FCEC36BC550520C001AB :1013500001213954EC78A878039B049FFF21EC31DC :10136000224E3D22D2009C422BD0B25C002A28D0D3 :10137000725C002A25D1984223D128790A38C0B25C :1013800031281ED8687902281BD8012808D1A879ED :10139000382805D1E879322802D1287A002810D0DF :1013A00025204001305C00280F4A16D101207054DE -:1013B0004120C000315C10220A43325403F036FA57 +:1013B0004120C000315C10220A43325403F0B8FAD5 :1013C000049F7D20800037543F20C000691D3150AC -:1013D000022001F091FC0920020390B205B0F0BD9B +:1013D000022001F013FD0920020390B205B0F0BD18 :1013E000E81F0020826900008A6A00007C18002043 :1013F000201D00208E040000800140048F040000A6 -:101400006A020000AA8A0000F0B593B0724C7C44D6 -:10141000204604F083FA808801F0A9FB204604F0FE -:101420007DFA8088C0B2634F04283ED80125294642 +:101400006A020000AA8B0000F0B593B0724C7C44D5 +:10141000204604F005FB808801F02BFC204604F0F8 +:10142000FFFA8088C0B2634F04283ED801252946C0 :1014300081401620014238D05F4E6B200002B17807 :10144000002902D0F178002930D1672000023179DB -:1014500007292BD305AC204607F02EFBA085574962 -:10146000084208D005A8002181850F9804F010FDDE -:101470006F2007020EE005A804F00AFD0F90504906 +:1014500007292BD305AC204607F0B0FBA0855749E0 +:10146000084208D005A8002181850F9804F092FD5C +:101470006F2007020EE005A804F08CFD0F90504984 :10148000087D0A2803D1FB3770790B2811D30F98F8 -:1014900004F0FEFC4A480021017504F0EDFC05A9AA -:1014A000884202D10F9804F0F3FC384680B213B0A2 +:1014900004F080FD4A480021017504F06FFD05A9A4 +:1014A000884202D10F9804F075FD384680B213B01F :1014B000F0BD44480818741D29220490214603F009 -:1014C000F4FA707980002843215C20184418601CCD -:1014D00000262946324600F0CDFF039064793A4851 -:1014E00037490C543D48784404F018FA80790421B7 +:1014C00076FB707980002843215C20184418601C4A +:1014D00000262946324601F005F8039064793A481F +:1014E00037490C543D48784404F09AFA8079042135 :1014F00008420DD1354800684021415C022902D0E4 :10150000816B002951D0412CC1D1806B0002044372 :101510002F482B49085C00281DD111AD284603999E -:1015200001F03BF9281D214601F037F97B208000AE -:101530002349085C002804D011A8082100F0E2FD2E +:1015200001F0BDF9281D214601F0B9F97B208000AA +:101530002349085C002804D011A8082100F01AFEF5 :1015400009E06846066046600846283011AA08236C -:10155000314604F05FFB0021049D284601F036FA75 +:10155000314604F0E1FB0021049D284601F0B8FA71 :10156000002805D00120014600F03AF8144C09E0AB :101570004120C000124C215C10220A43225428460C -:1015800003F044F925204001205C09210F030028C5 +:1015800003F0C6F925204001205C09210F03002843 :1015900083D010488168491C81604268914200DA1A :1015A0007BE75D210122425477E7012C2C46AFD026 :1015B0006DE7C04685690000E81F0020FFFF0000BE :1015C0007C1800203302000066020000201D00206D -:1015D0008E04000000180020AE880000D6870000AE +:1015D0008E04000000180020AE890000D6880000AC :1015E000F0B5B1B0002818D0039100216846016021 -:1015F0003448354C201827AB0A4601F04EF97B20C1 +:1015F0003448354C201827AB0A4601F0D0F97B203F :101600008000205C00280FD02020694648601FAA77 :101610000A604120800020180DE02D4B2A4A00204E :10162000D052692285263BE02020694648601FAAE7 -:101630000A60204628300121002304F0EBFA04AFB1 -:10164000384604F007FB2025684645601FAE06605B -:1016500001243846214632462B4604F0DBFA1E4868 -:10166000784404F05BF98079400820406946FF2205 +:101630000A60204628300121002304F06DFB04AF2E +:10164000384604F089FB2025684645601FAE0660D9 +:1016500001243846214632462B4604F05DFB1E48E5 +:10166000784404F0DDF98079400820406946FF2283 :1016700052320A60486027A8144C31462A46234655 -:1016800001F042FA6178C81C114A0F4B9852114A76 +:1016800001F0C4FA6178C81C114A0F4B9852114AF4 :101690009A5C61188A707A21CA430B32002603993A :1016A00000290DD183B2094CE254821C084B064D2F -:1016B000EA52401C80B2265491B2202003F074FC00 +:1016B000EA52401C80B2265491B2202003F0F6FC7E :1016C00031B0F0BD330200007C180020E81F00207C -:1016D00006020000660200005C860000F0B581B0E2 +:1016D00006020000660200005C870000F0B581B0E1 :1016E00067200602284D287901282AD1284C7C44FD -:1016F000204604F013F9808801F039FA204604F0FE -:101700000DF98088C0B2214FFF2819D021487844B4 -:1017100004F004F98088FF21084211D0FE1E04F075 -:101720003BFBAA280DD16C791B48784404F0F6F8ED +:1016F000204604F095F9808801F0BBFA204604F0FA +:101700008FF98088C0B2214FFF2819D02148784432 +:1017100004F086F98088FF21084211D0FE1E04F0F3 +:10172000BDFBAA280DD16C791B48784404F078F9E8 :10173000092109038088C0B2844205D10E4600E029 :101740003E46B0B201B0F0BD3E46FB36082CF8D89C :1017500000910120A0408B2149000842F1D00F4D9B -:101760007D44284604F0DAF8408801F000FA284663 -:1017700004F0D4F8408820423E46E2D0204600F0F3 -:1017800041FC009EDDE7C046E81F0020856900009F -:10179000CE850000AE850000928500005C850000CB +:101760007D44284604F05CF9408801F082FA28465E +:1017700004F056F9408820423E46E2D0204600F070 +:1017800079FC009EDDE7C046E81F00208569000067 +:10179000CE860000AE860000928600005C860000C7 :1017A0006D20000270470000F0B58BB009AD00213C -:1017B00006262846324603F08EF90A200A9901438C -:1017C000297101242846214601F0CAF90220284344 -:1017D000214601F0C5F9124F7F44384604F09EF8C7 -:1017E000801C2946324604F0F9F96D462026284629 -:1017F000314604F001FA384604F090F808302946E2 -:10180000324604F0EBF908AD2C70384604F086F847 -:10181000401C2946224604F0E1F90BB0F0BDC04659 -:10182000E4840000F0B581B0017800250091002922 +:1017B00006262846324603F010FA0A200A99014309 +:1017C000297101242846214601F04CFA02202843C1 +:1017D000214601F047FA124F7F44384604F020F9C1 +:1017E000801C2946324604F07BFA6D4620262846A6 +:1017F000314604F083FA384604F012F908302946DD +:10180000324604F06DFA08AD2C70384604F008F941 +:10181000401C2946224604F063FA0BB0F0BDC046D6 +:10182000E4850000F0B581B0017800250091002921 :1018300018D0441C002701250026204629463246A0 -:1018400000F018FE80B2094988420BD0084988424E +:1018400000F050FE80B2094988420BD00849884216 :1018500007D0241D7F1CF8B2009988423546EAD390 :1018600000E00225E8B201B0F0BDC0461DB10000A5 -:101870001EB10000F0B597B08E4FBC788020204399 -:101880006B210E0280286BD138790990FD78002CED -:1018900003D1022D01D3802D62D1D520C6010A9635 -:1018A000FE3E04F079FAAA285AD10BAE304607F072 -:1018B00003F9B0858049084208D00BA80021818532 -:1018C000159804F0E5FA6F20040238E00BA804F044 -:1018D000DFFA1590002C14D099218900774C615AB9 -:1018E0004D22D200002927D0A25A8A4224D174481E -:1018F0002018FFF797FF002835D000F0EBF80446DA -:1019000025E0012D0DD8212000016C4E3018002457 -:101910005822214603F0DFF878790B282FD3159849 -:101920000AE099218C00654D295B4D22D600AA5B07 -:10193000099BD2188A423ED904F0AAFA0A9C2120B7 -:1019400000015E4908180021582203F0C4F804F091 -:1019500093FA0BA9884202D1159804F099FA264609 -:10196000B0B217B0F0BD4120C000215C10220A4384 -:101970002254159804F08CFA09200603F0E7524827 -:1019800000680179514AB1548079514970544C48EA -:101990003018791D292203F088F878798100012315 -:1019A00019437A185079002D08932FD092790002AC -:1019B000104307222BE0039400246846046044602F -:1019C000284628307A1D029221461D4604F022F94D -:1019D000684604604460394894302146029A2B4698 -:1019E00004F018F93548805B4019344A90533C7034 -:1019F0000399515A80B2814204D1324802211152D6 -:101A00007C7054E02F480121115250E006229923A6 -:101A10009B00F0528918F62807D0B42805D000287A -:101A20000A9C159804F034FA89E74D20C5007453D8 -:101A3000283630460793059104F00CF91F4894307E -:101A4000049004F007F9059A079B06951B48405B34 -:101A50000999491D891ACDB228181849C95A8842CE -:101A600000D95CE7684604604460BA1830462146F5 -:101A700016462B4604F0CEF868460460446004988D -:101A8000214632462B4604F0C5F80C48024606991A -:101A9000505A281850523C700799515A80B28142CE -:101AA0001146089A01D17C70022206480A52092088 -:101AB00004034CE7E81F0020FFFF00007C18002013 -:101AC0003302000006020000201D00201102000069 -:101AD00012020000F0B5A1B03748384F00243C5244 -:101AE00003AD284606F0E8FFA8853549084207D02F -:101AF00003A884850D9804F0CBF96F20040242E01E -:101B000003A804F0C5F90D902021029168464160B8 -:101B100019AE0660294F2837012538462946324636 -:101B2000234604F077F8384604F094F868460660D7 -:101B3000029B436038462946324604F06BF86846FB -:101B4000046020481D4908180FAF214622463B4635 -:101B500000F0A3FE1D48784403F0E0FE80794008C1 -:101B60002840694664220A604860174C3846134F83 -:101B70003146029A234600F0C7FF6078801C0E4968 -:101B800078520920040304F077F903A9884202D1AE -:101B90000D9804F07DF92120000138180021582209 -:101BA00002F099FF03A8808D002802D1204621B0C1 -:101BB000F0BD02F0AFFFC046060200007C18002016 -:101BC000FFFF000033020000E81F002066810000D4 -:101BD00070B525204001094D285C002801D0084C33 -:101BE00009E04120C600FFF745FE0446A85DC00697 -:101BF00001D502F0BFFD204670BDC0467C18002014 -:101C000082690000B0B5014669228520002902D012 -:101C1000FFF760FF020A0749074B5C5A074D2A5538 -:101C2000A21C5A52611C89B2685491B2202003F060 -:101C3000BBF9B0BD060200007C180020E81F0020A0 -:101C40006D20000270470000F0B589B01E461746AF -:101C50000A460024E543782A00D987E0002A06D006 -:101C60000024015D002902D1641C9442F9D3049040 -:101C7000111B8A2048436421069206F06BFC034640 -:101C80005A1C306898423FD9019602950021384687 -:101C90000092059302F01FFF059B0394069884426F -:101CA00026D21946039A04980792805C491E08912F -:101CB0001C46395D09020E183D463A273046394622 -:101CC00006F0D2FC4743F11B2F46395539360899A7 -:101CD0008C4201D8732E04D3611E002C0C46E8DC24 -:101CE00000E02146079A521C06988242059BDAD1F1 -:101CF0000021039A029D019E785C002806D1481CB1 -:101D000099420146F8D302E032602FE0084600997C -:101D10008918091A336831608B4227D3131A002BB4 -:101D200010DB481E0028059B19DB134878447C18FB -:101D30001E46BB5DC35C635533465B1E491E0029CE -:101D4000F5DC0CE08A420AD20A49794414463B5C2D -:101D5000CB5C3B55401C641C33689C42F7D307485E -:101D600078440178384602F0B6FE0025284609B0CE -:101D7000F0BDC046766F0000946F0000606F0000F9 -:101D8000F0B595B000920F4602900AAC2A21204689 -:101D900006F056FD022004430594790001400D220F -:101DA0000A4303924140881D0190132500210298A7 -:101DB0000491405C0690002107200991401A0121FE -:101DC00008918140069801400791ECB2142C0ED87E -:101DD0001520021B60000AA90E183188C81C0429AE -:101DE00000D808463080521EB61C002AF5D160008B -:101DF0000AA9085AFF34072800D82C46E0B2132855 -:101E000017D814210D1A400005990A180AA90E5A6C -:101E1000138801210027072B084600D83846760092 -:101E20000E2737400743C8431752921C6D1E1E46AB -:101E3000EED107980028089A00D102461498400075 -:101E40000E21014011430AA801850999491C08295E -:101E50002546B1D10499491C08292546A7D100215E -:101E60000B460A460C46009ED8B240000AAD285ADE -:101E7000240603D1002801D10C4604E0D4B230304E -:101E80003055521C01245B1CD8B2039D8542EBD80F -:101E90001106019D02D1302131700122002421461A -:101EA000CEB2B5420D4622D9361876000AAFBE5BD7 -:101EB0006D1C002E04D1EEB2019FB742F4D816E09B -:101EC0002506009F04D1D4B22E253D55521C012475 -:101ED000DDB26D000AAE755B3035D6B2BD55521C11 -:101EE0005B1C491CCDB2019EAE423546D8D8D0B25B -:101EF00015B0F0BD80B583218900044A52580449C9 -:101F00000968496CFFF73CFF80BDC0467C18002083 -:101F1000201D0020F0B583B02B4D00262B4A28460B -:101F2000314602F0D8FD2846314600F019FE284817 -:101F30002E52252040012E54264801242C54264898 -:101F400028180822314602F0C6FDFF20EC302E543E -:101F500022482E542248784403F0E0FC40780128BF -:101F600001D0FFF721FC1F48784403F0D7FC4078EC -:101F7000002807D01C48784403F0D0FC808800F08B -:101F8000F6FD02E0FF2000F03DF81848784403F029 -:101F9000C5FC0078002814D102AD2C7001AE34705D -:101FA000134F7F44384603F0B9FC293031462246AE -:101FB00003F014FE384603F0B1FC2946224603F034 -:101FC0000DFE03B0F0BDC0467C180020A404000044 -:101FD0007604000084040000850400008D040000E5 -:101FE000667D0000547D0000467D0000307D0000CD -:101FF0001A7D00004021415C01220A400221114368 -:102000000170704710B582B0014601AC204600F067 -:10201000A7FD0548784403F081FC001D02222146FB -:1020200003F0DCFD02B010BDA87C0000F0B58DB05F -:1020300007464120800032490D180C46284603F01F -:1020400009FE002668460660466077208000221858 -:1020500004232846314603F0DDFD684606604660ED -:10206000172000012218202428463146234603F079 -:10207000D1FD6846066046601920000120490A1813 -:1020800028463146234603F0C5FD0C960B96039770 -:1020900008377D2084000CAA0BAB3846214600F09F -:1020A0000DFA002828D00B980C9900266A46166075 -:1020B00056600B18083328463146039A03F0AAFDF0 -:1020C00004AA3846214600F023FB002813D06846B6 -:1020D0000660466004AA1A232846314603F09AFD9A -:1020E000684606604660082328463146039A03F096 -:1020F00091FD012600E0002630460DB0F0BDC0463F -:102100007C180020F0B583B00C46054600266846D2 -:1021100006604660412080000A490F181B2000011C -:102120000A1820233846314603F074FD68460660DD -:102130004660384631462A46234603F06BFD03B01D -:10214000F0BDC0467C18002070B504461E4E3068B5 -:10215000416B002911D01D4979440322204602F029 -:10216000C3FC012500282CD01949794403222046BC -:1021700002F0BAFC002824D030684021405C1328CB -:102180000CD1144979440422204602F0ADFC002809 -:1021900016D118341049794428220BE00F497944AC -:1021A0000422204602F0A0FC002809D118340C4972 -:1021B00079440222204602F097FC0125002800D035 -:1021C0000025284670BDC046201D0020296B000058 -:1021D0001A6B0000036B0000F56A0000AF6A000094 -:1021E000A16A0000B0B50446154800684021405C73 -:1021F000132810D1134979440322204602F074FCBD -:1022000000281AD11734104979442722204602F0B9 -:102210006BFC01250FE00D4979440322204602F0B2 -:1022200063FC002809D11734094979440125204667 -:102230002A4602F059FC002800D000252846B0BDEF -:10224000201D0020616A0000526A00003B6A000005 -:102250002C6A0000B0B504460C480068406B0028AA -:1022600010D00B4979440322204602F03DFC0125A1 -:10227000002808D0074979440322204602F034FCA4 -:10228000002800D000252846B0BDC046201D0020F3 -:102290001D6A00000E6A0000B0B504461B4979446F -:1022A000032202F021FC002809D1204623301849DE -:1022B000794401252A4602F017FC002824D015494C -:1022C00079440322204602F00FFC002809D1204661 -:1022D00023301149794401252A4602F005FC0028E3 -:1022E00012D00E4979440322204602F0FDFB00285B -:1022F00009D143340A497944012520462A4602F08F -:10230000F3FB002800D000252846B0BD156A000068 -:102310000C6A0000F6690000E8690000D569000059 -:10232000C6690000F0B586B0FF2414700468002769 -:102330008C421AD20B9E002B01D000241C60002E70 -:1023400001D00024346005684C1B012C0DDB059284 -:102350002A46551C056014784E2C5FD804954C2CE9 -:10236000039704D22746049D45E03C4659E00027E8 -:102370004E2C26D04D2C0DD04C2CF4D10294374647 -:10238000049C0E1B0024012E3E464ADB951C056072 -:1023900057782FE002940196049C0E1B0024022E15 -:1023A00015463EDB009300231C461F46049AD65C6C -:1023B000E4B2A640F7195B1C0834022BF7D1ED1CE0 -:1023C00015E002940196049C0E1B0024042E154671 -:1023D00027DB0093002423462746049A165DDBB2D0 -:1023E0009E40F719641C0833042CF7D16D1D05605D -:1023F000009B019E029C491B002915DB0495254684 -:10240000B942039C0DD3002B01D004991960002E12 -:102410002C4600D037600168C91901600598047026 -:102420000124204606B0F0BD039CFAE7F0B581B068 -:1024300000920722D34308240029224600D01A46DE -:10244000002900D10C4600252946465D7F273740EC -:10245000002D334600D13B46009F002F00D01E4682 -:10246000E3B29E4071189C186D1C022DEDD10846F8 -:1024700001B0F0BDF0B581B000920722D34308222D -:10248000002900D01A461824002900D10C46002546 -:102490002946465D7F273740002D334600D13B4615 -:1024A000009F002F00D01E46E3B29E4071189C187A -:1024B0006D1C042DEDD1084601B0F0BDF0B5044609 -:1024C00000201060186000291FD02578FD26FC2D03 -:1024D00001D8012710E0032917D3B54215D1601C9C -:1024E000002426462546075DF6B2B7407D19641CD8 -:1024F00008360327022CF6D115601F601068C31937 -:10250000012000228B4200D91046F0BDF0B585B005 -:10251000144602460020FD26002B029608D0002318 -:1025200000291BD01578B54205D201212B4616E0B3 -:102530000B46014613E0032910D3B54219460ED1CC -:10254000561C00252F462B46715DFFB2B940CB18B3 -:102550006D1C08370321022DF6D100E01946029DBB -:10256000AD1C04AE357055180395D2185518002BC4 -:1025700017D0002637466846066003A804AA2946F5 -:102580003346FFF7CFFE00280AD004A80178781C54 -:10259000A14200D038460399A9420746EBD100E09A -:1025A000384605B0F0BDF0B585B002920027FD2297 -:1025B000002B08D0002300291BD00478944205D2B8 -:1025C0000121234616E00B46394613E0032910D3B8 -:1025D000944219460ED1441C00252E462B46615DBF -:1025E000F6B2B140CB186D1C08360321022DF6D18E -:1025F00000E01946921C04AC227042180392C018E5 -:10260000451802980128019716DB002B019F13D073 -:102610000B9C0A9E00276846046003A804AA29466A -:102620003346FFF77FFE002806D07F1C02988742C2 -:1026300002DA0398A842EED1012002998F4200D01D -:10264000019805B0F0BD000070B501464A7801233D -:1026500000246A2A184600D020460B4D2D684026DB -:10266000AD5D022D00D023461843022D0AD16A2AFF -:1026700008D00020002A05D18A78012000216A2A8A -:1026800000D0084670BDC046201D002080B5C12284 -:1026900000F002F880BD0000F0B581B015460E468E -:1026A0000746FFF751FD0024002804D13846FFF704 -:1026B00099FD002802D0204601B0F0BD0E48006808 -:1026C0004021405C7978022807D16A2905D0002989 -:1026D00007D1B8786A28EED003E06A29EBD0022847 -:1026E000E9D00123384631462A46FFF70FFF002480 -:1026F0000128E0D10446DEE7201D002080B5C2227B -:10270000FFF7CAFF80BD80B5C422FFF7C5FF80BDBB -:10271000F0B585B0144600270497039703AA6B46CB -:102720005A6004AA1A60022201263346FFF73BFFD3 -:1027300001283D4600D1054604990029304600D1C4 -:10274000084605400398142800D03E463540002D29 -:1027500011D076206070192020701422E27077204A -:10276000C64330462130A070201D02F09EF9243669 -:10277000667688202076284605B0F0BD70B5002327 -:10278000002A08D00023521E94B2055D0E5D6E40F3 -:102790003343002CF7D1D8B270BD01700A0A4270E1 -:1027A0000A0C8270090EC1707047F0B5A3B01646CE -:1027B00003AC202522462B4603F058FA0BAF3846CF -:1027C00003F03CFA142069460E6048600121384647 -:1027D00022462B4603F01EFA23B0F0BD70B588B038 -:1027E00014466D4620262A46334603F03FFA284613 -:1027F00031462A46334603F039FA04222046294658 -:1028000002F053F908B070BDF0B58BB01D46144608 -:102810000346109E02270120FF2E00D8074611987C -:10282000002808D014203843C2B202A8194602F08A -:102830003CF9FFB20EE0FFB202A8C2191846FFF73A -:10284000B4FF300A04D002A84670310A017001E0DA -:1028500002A806701421394302AEF2191432304630 -:10286000FFF7BCFF01951821394301AB30462246E2 -:10287000FFF7EAF9002803DB01A800880BB0F0BDE0 -:10288000012002F047F9002A06D0491E8B5C037034 -:10289000521E401C002AF9D17047F0B58DB0174682 -:1028A00006780B2E3CD201910293002E13D0401CCF -:1028B0000021182200252B46445DD2B29440E31833 -:1028C0006D1C083A042DF7D18A0003ACA350491CB3 -:1028D000001DB142EDD102F007FD684607602127D7 -:1028E00003AD3846294632462B4603F037FA2022FC -:1028F00038462946029C234603F0DCF9019800285B -:1029000005D0129921200123224603F0E3F902F0B9 -:10291000EBFC03A80021202202F0DDF80DB0F0BD91 -:10292000022002F0F7F80000F0B58DB002461078F2 -:102930000B2843D2012600283DD002960191521C5B -:102940000024182500273E46D35DEDB2AB409E190A -:102950007F1C083D042FF7D1A30003ADEE50641C8B -:10296000121D8442EDD10528029E24D10126F207D2 -:10297000039B53402C2B03D0542B01D0312B1AD165 -:1029800010490B681C88002C06D0049D5540A542B8 -:1029900002D059888D420ED16432059991420ADCE9 -:1029A00006990198814206D1074A079B012600211A -:1029B000934200D80E4630460DB0F0BD022002F022 -:1029C000A9F8C046201D002050C30000F0B58DB00E -:1029D00002461F4803681C880120002C33D0107861 -:1029E000022801D208462EE0019102930B282CD236 -:1029F000521C0025182600273B46D15DF6B2B14097 -:102A0000CB187F1C083E042FF7D1A90003AE7350EA -:102A10006D1C121D8542EDD10122D3070398584049 -:102A20002C280299019D04D0542802D03128284630 -:102A300009D1049D5D40A542104604D04A8801207A -:102A400000219542CED10DB0F0BD022002F062F817 -:102A5000201D0020F0B585B004920C4602780B2AA8 -:102A60004CD2202121700121002A3DD00499891ED9 -:102A70000191461C00230121029203931820002299 -:102A80001546B35CC0B283405D19521C0838042A55 -:102A9000F7D1C9B26018049A511A0122D2072B4605 -:102AA0009343184A7A4402F065FD2746204604996C -:102AB00006F0BCF8C1B2361D019A91421BDA002D16 -:102AC000039B01DB3C4603E027223C466254401C4A -:102AD000C1B22F226254411CC8B2002222545B1C96 -:102AE000D8B2029A9042C8D3C8B2401E00212154E5 -:102AF000C0B205B0F0BD032002F00CF8022002F0D5 -:102B000009F8C04619620000F0B587B01C461746A8 -:102B10000591064602F0E8FB0020069006AD6846E7 -:102B2000C5600C998160446007600D98002801D051 -:102B30000A4900E0084903223046059B03F0DAF811 -:102B40002878C00703D0207801210143217002F0CA -:102B5000CBFB07B0F0BDC046010400000106000039 -:102B60000A020A43FF21090251400180704780B5E3 -:102B7000FF218143000A814201D003F025F880BD86 -:102B8000F0B5002307241E46155D0F5DF619751973 -:102B900005550126FF2D00D81E46671E002C3C4619 -:102BA000F2D101200021FF2D00D80846F0BDF0B57C -:102BB00081B0002607240096155D0F5D330604D012 -:102BC000AF4204D97F1E002303E0009B01E0FF37E2 -:102BD0003346BFB27E1B06550126AF4200D31E46C8 -:102BE000631E002C1C46E7D1F0B201B0F0BD00001E -:102BF00070B582B0044601263002114D285C304287 -:102C00000DD03F20C0002A58002168460160416075 -:102C100028462830234602F0FDFF3002285C80075A -:102C20000BD53F20C0002A58002168460160416052 -:102C300094352846234602F0EDFF02B070BDC04631 -:102C40007C180020F0B581B07D208600294DA85D5C -:102C5000002848D03F20C700E8590478FC2C05D84C -:102C600001252846FFF7C4FFFF2031E0FE2C19D0D4 -:102C7000FD2C3BD10120FFF7BBFFE859411CE95176 -:102C8000A95DFF31A955C9B201292CD9417800911C -:102C9000847802252846FFF7ABFF240200980443FE -:102CA000FE2015E00120FFF7A3FFE859401CE85182 -:102CB000A95DFF31A955C9B2032914D900210A46DB -:102CC000FFF7D8FB044604252846FFF791FFFC20B8 -:102CD00008490A46D1594919D151915D401890557A -:102CE000204601B0F0BD012001F014FF022001F0E8 -:102CF00011FFC0467C180020F0B5BFB00646E94879 -:102D0000784402F00BFE857933AC204605F0D4FE02 -:102D1000A085ED0801273D4084B2002C01D000F0D1 -:102D200065FC33A803F0B4F83D90002D199700D14D -:102D300019951B951DA8C01D189025A8011D169159 -:102D400028301790F1481C961A9707466AE2072820 -:102D500000D067E23C69002C00D161E27D20850053 -:102D6000785D002801D100F030FC844200D3044695 -:102D7000002CE64F01D100F028FCE0B2FFF738FF4D -:102D80003F20C000395809193950785D001B78552B -:102D90003869001B386145E24E783446083CE1B2A0 -:102DA000302901D900F01FFCB11C1191C9B2884231 -:102DB00001D200F018FCD648784402F0AFFDD349A8 -:102DC000149D49596A46566025AB059313608A1CC9 -:102DD00008302021234602F059FFCC484059801981 -:102DE000811F08220598FFF7C9FC002800D0FAE3EC -:102DF000C64D149EA8593D21C9006A5C002A0DD019 -:102E00003A22825C3223C254A859401DA851EA5D7F -:102E1000F332EA55695C012200293DD1811C25AEBF -:102E20003046224601F041FE3078322800D0DAE305 -:102E3000B6480546149EAC591698A8512420FFF7B1 -:102E4000D7FE11996018A851E85D401AE8552F4641 -:102E50001DA808221799FFF716FD0020014602461B -:102E6000189E735C7C18257F5219D3182377012292 -:102E7000FF2B00D80246491E0C460834F1D101252B -:102E8000FF2B00D885E0AEE33D20C0009F49085CE1 -:102E90000022002800D1A6E3139201263046FFF756 -:102EA000A7FE9A4D14996858421C6A50E85DFF309D -:102EB000E855C0B2232800D895E3F5204000285CEF -:102EC000002826D034022E552420FFF791FE002042 -:102ED0000C942855149C295924312951E85DDC3083 -:102EE000E855C0B2072800D87DE30F20400128181C -:102EF0000822039201F0D9FD0398FFF779FE0C98A0 -:102F00002E54285908302851E85DF830E855139DB3 -:102F10003FE0002168460160416017200001281849 -:102F20002424234602F076FE2046FFF761FE149823 -:102F3000295824312950E85DDC30E855C0B2072813 -:102F400000D850E31DA80822FFF79DFC0020014691 -:102F50000246189B5B5C6D4C6418257F5219D31890 -:102F60002377FF2B324600D80246491E0C46083410 -:102F7000EFD1FF2B139D00D935E30820FFF738FE72 -:102F800062480146149A885808308850C85DF83065 -:102F9000C8553D20C0005D4A105C002802D10120C8 -:102FA000010250541C9E159CFFF74CFE574F386190 -:102FB000022171403D22D200BB5C2B430B43002217 -:102FC000002B214600D0114600281A9A00D1044651 -:102FD0000C4054401B98002802D1002C00D102E381 -:102FE000022038757D25AC00385D002800D1ECE268 -:102FF000396901291A9B20D13F20C600B8590078B1 -:1030000001210022AE2800D11146199A114301294D -:1030100006D101210022AE2800D111465940F9778E -:103020000120FFF7E5FDB859401CB851385DFF306D -:1030300038553969491E39611C9E002917D04D1E2B -:10304000C0B2854200D30546002D304F00D1BCE20E -:10305000E8B2FFF7CDFD3F20C0003958491939507B -:10306000385D401B38553869401B3861DAE0022E64 -:103070001ED13D21C900795C002915D0F5214900F8 -:10308000795C002914D000216846016041600F205E -:1030900040013A1838462830082302F0BBFDA8004A -:1030A000385C05E0BC6F00000121090203227A545C -:1030B000C0B2032800D896E2F52040003D21C900A7 -:1030C000795C00290ED0385C00280BD13F20C0006D -:1030D0003A58002168460160416038462830042390 -:1030E00002F098FD0420FFF783FD3F20C00039580F -:1030F000091D3950385DFC30385501203875B868E5 -:10310000401EB860F868401CF8608BE07C18002016 -:10311000046F0000F5204200B95C3D25E800385CF2 -:1031200000284FD000294DD120266846466025A9A9 -:1031300009910160172000013C180B9401210491B2 -:103140000023089320460F92099F3A460E9502F0FD -:1031500061FD204602F07EFD68460760466020461D -:10316000049D29463A46334602F054FD68464660BF -:103170001DAF0760ED4C2834204629463A46089B8F -:1031800002F048FD204602F065FD68460760466093 -:10319000204629463A46334602F03CFD0B980999F1 -:1031A000324601F082FC19200001E0490818394636 -:1031B000DE4F32461C9E01F078FC0F98395C0E9869 -:1031C000C000385C002822D0002920D0D848385CC4 -:1031D00000280BD100216846016041601B200001DE -:1031E0003A1838462830202302F014FD0A2038759A -:1031F00018E0052816D17D208400385D002800D114 -:10320000E3E13D69002D00D01BE7042076E70921AA -:103210003975002806D03846283002F01BFD01E041 -:1032200008203875397D00E03975C8B2042807DCFC -:1032300002286EDD03282AD00428F3D1B86836E0CE -:10324000062800DDBBE1D4D17D208400385D002854 -:1032500000D1BAE1032800D8C5E10420FFF7C8FC7B -:103260003F20C000E74F3958091D3950385DFC3008 -:1032700038550821FF221042D6D001242502002013 -:103280007855FFF7DFFC7C5538610721CCE7022E2B -:1032900000D13FE77D208000385C002800D194E118 -:1032A000FFF7D0FC0021B860F960042139750621D0 -:1032B0000028B9D07D208400385D002800D184E149 -:1032C000072800D88FE1012ECE4F11D101204002F6 -:1032D0003858F96881420BD13F20C0003958384630 -:1032E0001530082201F0E1FB7F20800001213954D4 -:1032F0000820FFF77DFC3F20C000395808313950C5 -:10330000385DF8303855FFF79DFC38610520387579 -:1033100071E7002806D0012802D0022882D161E698 -:10332000B868E0E00026BE60FE603E6138461530B9 -:103330000822314601F0CFFB3D462835284602F0F1 -:1033400089FC3C469434204602F084FC3D20C000B9 -:10335000385C00283AD0012000023E54F52040009D -:10336000385C00282DD068460660466077208000D3 -:103370003A1804232846314602F04CFC68460660A1 -:103380004660172000013A18079220200690284630 -:103390003146069B02F03EFC6846066046601920F6 -:1033A00000013A1828463146069B02F033FC684675 -:1033B00006604660602320463146079A02F02AFCE8 -:1033C00004E017200001381802F044FC7D20109022 -:1033D0008600B85D032800D805E13F20C500795973 -:1033E000772080001290381804240A90224601F0B9 -:1033F0005CFB2046FFF7FCFB7859001D0D957851CA -:10340000B85DFC30B8558049795C002917D0C0B24E -:10341000032800D8E7E07B4F0D9D79594920000132 -:1034200038180424224601F040FB2046FFF7E0FB59 -:103430007859001D7851B85DFC30B8551FE07348CD -:1034400000684021405C16280A9C18D80121814060 -:103450006F48014213D0002120460A46FFF70AF8C0 -:1034600000280CDA002120460A46FFF703F86949D4 -:10347000884204DB109880006249085CC7E7634813 -:1034800000684421415C890718D5007A022806D0DB -:10349000042813D15B481299405C01280ED8594C7E -:1034A000A05D032800D89EE00420FFF7A1FB0D9942 -:1034B0006058001D6050A05DFC30A055FFF7C2FBB6 -:1034C000504FB860252149011C9E022E524A08D156 -:1034D000795C002905D05168002900D15060002195 -:1034E00011600121397500281DD07D2039468700E3 -:1034F000C85D002869D00124022E1BD0012E25466C -:1035000000D051E523286ED92420FFF771FB3F201E -:10351000C0003C490A46115824311150D05DDC30BE -:10352000D055012540E5032038757BE67C18002046 -:103530008E040000012856D93F21CA001492314957 -:1035400089580A78022A159400D19DE4012A00D1F5 -:1035500022E4002A47D13D20C0002A49085C002807 -:1035600041D12E4C7C44204602F0D8F98088FFF7E8 -:10357000FEFA204602F0D2F98088C0B2042806D0B4 -:10358000022804D001282ED11B9800282BD01D4CD6 -:10359000149D6059401C6051E05D401EE055C0B272 -:1035A000232820D92420FFF723FB605924306051C1 -:1035B000E05DDC30E0550120A0770025E9E401461C -:1035C0000839032901D3FFF7C2FB02F055FC33A9E8 -:1035D000884202D13D9802F05BFC33A8808D002820 -:1035E0000DD13FB0F0BD012001F094FA33A80025C1 -:1035F00085853D9802F04CFC02480575204601F097 -:1036000089FAC0467C1800208E040000201D00208E -:10361000800140000300008000180020586700006F -:10362000F0B581B000900B09012213405B42194CA8 -:103630001C40CD0815406D42174E2E404701774083 -:1036400067404C09144064421448204078408E0979 -:1036500016407642124F37404740C809104040425A -:10366000104A02407A4098272F40009DED0E4901F4 -:103670002943C9B2794079251D404D40F3212140AD -:103680006940AE2333404B401E2101405940104653 -:1036900001B0F0BDE2996DB7618EBCF2C4B35F3E7C -:1036A000A8E2AB2E70E4434FF0B581B015460E464C -:1036B00007463C78012000210090FFF7B1FF002C65 -:1036C00012D07F1C1F22224042403C781046FFF758 -:1036D000A7FF7F1C002CF5D106E0FFF7A1FF0246F3 -:1036E000307850406D1E761C002DF6D10824FFF76F -:1036F00097FF641EFBD1009A504001B0F0BD00005E -:1037000070B514460A4601460D487844FFF7CCFFD1 -:1037100023220546D54020239E1A0B46B3402B4357 -:103720001646203E0D46F540002E00DA1D461F23AA -:103730002B402370531F641C002A1A46E9D170BD28 -:103740004E560000F0B599B01D4603460020179074 -:103750001690107014296FD11E990020002904D0F2 -:10376000012969D10192082000E001920CAF387064 -:10377000781C1422194601F098F9152100263246CA -:1037800030463B7800021843134608337F1C491E1D -:103790000224E443A2420EDB0D3213460A3B0446E8 -:1037A000DC401F23234002ACA355521F761C092A7C -:1037B000F3DC521F00E01A460029E2D1002A019FE3 -:1037C00007D00521891A88401F21014002A8815590 -:1037D000761C02A816AA3146FFF792FF0020002EA1 -:1037E000394611D002A801780023144A7A442029CE -:1037F00020D2581CAB421DD202ACE45C145DFC54D8 -:10380000B0420346F3D3391800220D4B7B4416AC6B -:103810002478202C0ED28418641CAC420AD816AC32 -:10382000A45C1C5D8C54521C082AF0D300238B54DA -:10383000801801E00020387019B0F0BD7855000004 -:103840005855000070B594B014460A46014601A8C8 -:10385000FCF7F3FB01460020002912D001A80278F2 -:1038600000216B461960011D21250CAE2846334608 -:1038700002F074FA202228463146234602F01AFA52 -:10388000012014B070BDF0B59DB0144613AAFFF727 -:10389000D9FF0025002811D021266F4613AA012543 -:1038A000304639462B4602F015FA08373846FEF7FF -:1038B000A1FB20463946324601F0F7F828461DB0F4 -:1038C000F0BD0000F0B58BB00746119C012F17D05A -:1038D000129E032F12D1212205AF084611463A4607 -:1038E000FEF763FF0025684605601421384622462E -:1038F0003346FFF727FF002836D136E0022F25D1C7 -:103900000393049405A81425457000240470861CB4 -:103910002122084611463246FEF747FF022F0DD1FD -:103920001099002908D068460560002204983346A3 -:1039300002F0BCF8002817D1002516E0684603996C -:1039400012C005A816219623049D09E025460024EF -:10395000684614C00648301883B221220846114632 -:103960002A46FEF751FF2C54012528460BB0F0BD26 -:10397000FFFF000070B59AB00E460446206900258E -:1039800000282AD0217BA068401CFF31C9B211AAAF -:1039900000252B46FFF777FF00281ED0F388B2885A -:1039A000A0680078716B33256E46B56004AD22C601 -:1039B00011A9FFF787FF002500280ED0246904AD68 -:1039C000284605F09BF8421C2846214604F04EFF8D -:1039D00001250021002800D00D4628461AB070BDF0 -:1039E000F0B585B00A4606460020B07334460E3462 -:1039F000317B082927D803AF0021019108253846DB -:103A000002922A4601F067F8327BA81A3818B1688A -:103A100001F04BF8029D2735284605F06FF8C6B235 -:103A200020462946324601F040F82020A055A01932 -:103A3000421C0298416C3846FEF7A2F93018201853 -:103A400001994170012005B0F0BD000070B598B03B -:103A500004466D466021284604F0F2FEA16928461E -:103A60001C30402205F0ACF85C20295C00200029C5 -:103A700017D1227B082A14D8267D082E11D86D462E -:103A8000A81A1430A16804F0E1FEA81B1C302169BB -:103A9000324604F0DBFE04486022294604F0D6FEDC -:103AA000012018B070BDC0460018002010B50C49A8 -:103AB0000860FEF72FFA252040010A4901240C5422 -:103AC00001F062F92102084804F0BAFE002003F078 -:103AD0003FFE204603F03CFEFCF780FB10BDC046D5 -:103AE000201D00207C180020241D002080B50648E1 -:103AF0000078002801D104F089FC044979440020B1 -:103B0000024604F031F880BD241D0020A4570000B7 -:103B100080B582B001900648784401F0FFFE29305C -:103B200001A9012202F05AF8FFF7E0FF02B080BDC0 -:103B3000A461000001460020022903D88800024940 -:103B4000794408587047C046BC56000080B501282B -:103B500005D0002807D10020FFF7DAFF80BD012043 -:103B6000FFF7D6FF80BD002003497944034A7A4419 -:103B700004F046FC80BDC046130000002700000092 -:103B800001460020012903D88800024979440858D9 -:103B90007047C0467C56000080B5002802D0FFF771 -:103BA000A5FF80BD0648784401F0B8FE2921435C9A -:103BB000002004497944044A7A4404F003FC80BD9F -:103BC000166100007DFFFFFF91FFFFFF80B5002021 -:103BD00003497944034A7A4404F012FC80BDC0468C -:103BE000ABFFFFFFBFFFFFFF80B5FF2002F010F922 -:103BF00080BD80B50120FCF77DFEFFF777FF80BD1B -:103C000080B50020FCF776FEFFF770FF80BD80B521 -:103C10000120FCF76FFEFFF769FF80BD80B5002033 -:103C2000FCF768FEFFF762FF80BD80B50020FCF75F -:103C300061FEFFF75BFF80BD80B50120FCF75AFEF7 -:103C4000FFF754FF80BD80B500200146FDF7C8FC9A -:103C5000FFF74CFF80BD80B501200021FDF7C0FCBF -:103C6000FFF744FF80BD80B50020FCF743FEFFF75F -:103C70003DFF80BD80B50120FCF73CFEFFF736FF1D -:103C800080BD80B50178490601D001F0F3F880BD10 -:103C9000B0B50546072028400024012814D002288A -:103CA00014D1002909D00B4802F0BEF868B20028F0 -:103CB0000ADA01F089FF002406E0FF2152310548AD -:103CC000002202F0C9F804462046B0BD022000F0F0 -:103CD00021FFC046E81F0020F0B581B0E04D2878F4 -:103CE0000C2810DD0D286CD00E2800D1C7E0152857 -:103CF0000FD1DC48807901280BD1A879000708D4BE -:103D0000102000F007FF052800D111E10C2800D198 -:103D100081E2D54C0027676001202070204602F028 -:103D200047F8042002F0C0F86060692800D05DE127 -:103D300001F044F801F044F8BE25F84E7753042012 -:103D400002F0B2F86060002800D164E2972800D148 -:103D500061E2C0243059002800D15CE2705BAA27E0 -:103D6000C421715C80B2884200D354E202F068F84A -:103D7000002800D04FE201F0E5FFB84204D102F084 -:103D80000BF8B84200D046E23059715B4901401847 -:103D9000CC217158002902D0884700280AD0012878 -:103DA00003D13059715B490140180178490601D0AF -:103DB00001F060F8705B401C705331590029CFD17D -:103DC00029E2D54C0027676001202070204601F0D1 -:103DD000EFFF042002F068F86060002800D11AE2CA -:103DE000972800D117E2692800D099E100F0E6FF9A -:103DF00000F0E6FFBE25C94E7753042002F054F8C8 -:103E00006060002800D106E2972800D103E2C024B8 -:103E10003059002800D1FEE1705BAA27C421715CF3 -:103E200080B2884200D3F6E102F00AF8002800D000 -:103E3000F1E101F087FFB84204D101F0ADFFB842D3 -:103E400000D0E8E13059715B49014018CC2171582C -:103E5000002902D0884700280AD0012803D1305910 -:103E6000715B490140180178490601D001F002F860 -:103E7000705B401C705331590029CFD1CBE1EA4D22 -:103E800000276F6001202870284601F091FF042070 -:103E900002F00AF804466C60692C00D0E6E000F0FD -:103EA0008DFF00F08DFFBE24E04E3753042001F05B -:103EB000FBFF6860002800D1ADE1972800D1AAE19E -:103EC000C0257059002800D1A5E1305BAA27C42184 -:103ED000715C80B2884200D39DE101F0B1FF0028FF -:103EE00000D098E101F02EFFB84204D101F054FF58 -:103EF000B84200D08FE17059315B49014018CC21A4 -:103F00007158002902D0884700280AD0012803D11F -:103F10007059315B490140180178490601D000F021 -:103F2000A9FF305B401C305371590029CFD172E199 -:103F3000BD4C0027676001202070204601F038FF4B -:103F4000042001F0B1FF6060002800D163E19728F0 -:103F500000D160E1692800D018E100F02FFF00F0E7 -:103F60002FFFBE25B14E7753042001F09DFF606006 -:103F7000002800D14FE1972800D14CE1C0243059EE -:103F8000002800D147E1705BAA27C421715C80B290 -:103F9000884200D33FE101F053FF002800D03AE10E -:103FA00001F0D0FEB84204D101F0F6FEB84200D0D4 -:103FB00031E13059715B49014018CC217158002919 -:103FC00002D0884700280AD0012803D13059715BFC -:103FD000490140180178490601D000F04BFF705BA1 -:103FE000401C705331590029CFD114E1C0258F4CAA -:103FF0006059002800D106E1BE26A05BAA27C42193 -:10400000615C80B2884200D3FDE001F019FF002816 -:1040100000D0F8E001F096FEB84204D101F0BCFEF9 -:10402000B84200D0EFE06059A15B49014018CC21B3 -:104030006158002902D0884700280AD0012803D1FE -:104040006059A15B490140180178490601D000F090 -:1040500011FFA05B401CA05361590029CFD1D2E0D1 -:10406000241E00203C210020501F0020D8206F4D2E -:104070002958002911D0642264290B4600D3134625 -:10408000CA1A2A50D421002A07D16958002904D01D -:10409000DC22AA582A5000208847002C00D1BAE020 -:1040A000972C00D1B7E0C024285900282FD0BE2675 -:1040B000A85BAA27C421695C80B2884227D201F09C -:1040C000BFFE002823D101F03DFEB84203D101F02C -:1040D00063FEB8421BD12859A95B49014018CC2185 -:1040E0006958002902D0884700280AD0012803D146 -:1040F0002859A95B490140180178490601D000F010 -:10410000B9FEA85B401CA85329590029D2D1C4206C -:10411000285CBE21695A7AE0501F0020241D00202F -:10412000C025424C605900286DD0BE26A05BAA274E -:10413000C421615C80B2884265D201F081FE002812 -:1041400061D101F0FFFDB84203D101F025FEB84274 -:1041500059D16059A15B49014018CC21615800290F -:1041600002D0884700280AD0012803D16059A15BFA -:10417000490140180178490601D000F07BFEA05BA0 -:10418000401CA05361590029D2D13CE0D020274CDB -:104190002058002803D0E978490800F0AFFEC02578 -:1041A000605900282FD0BE26A05BAA27C421615CDD -:1041B00080B2884227D201F043FE002823D101F0CB -:1041C000C1FDB84203D101F0E7FDB8421BD16059EF -:1041D000A15B49014018CC216158002902D08847D1 -:1041E00000280AD0012803D16059A15B4901401879 -:1041F0000178490601D000F03DFEA05B401CA053B1 -:1042000061590029D2D1C420205CBE21615A81426B -:1042100001D301F015FE01F013FE002801D100F0DA -:1042200081FC012001B0F0BD501F0020241D0020A2 -:10423000F0B5A5B01E4614460F460546FEF704FA33 -:10424000002807D0A74979440A22204604F0FEFA44 -:1042500025B0F0BD0494A14800684024005D1128F9 -:1042600044D128463946FEF74EFA03909B48006831 -:10427000005D11283AD128463946FEF707FA002892 -:1042800012D07B208000039C002C07D09449085C4E -:10429000002803D0083D2846FDF7C8FE002C0498EE -:1042A0007ED0924979447DE08C480068005D1128F9 -:1042B0001CD128463946FEF721FA002816D07B206B -:1042C00080000399002907D08549085C002803D0A5 -:1042D00028460838FDF7AAFE2C78FD2C7F4F64D1C4 -:1042E0006878A97809020143C81C5FE02846FDF7F9 -:1042F000B1FF002810D079480068406B0028A7D093 -:1043000001F00CFB0146A8786A461060EB1C002205 -:10431000049801F0CBFB9BE7704F3868C4882846AF -:10432000FDF712FF0321002802D038688488042199 -:10433000200A04D005AA54701070022702E005A8D4 -:104340000470012705A8C0196918142503902A468E -:1043500000F0ABFBFF20EA306149085C002810D078 -:104360005E480068C28801200021944200D00846BF -:104370006946086014210398049A3346FFF7E2F96E -:1043800066E7012069460C6048602F43B9B2B3B2BA -:1043900005A8049C2246FEF737FA0021215457E76E -:1043A0005149794404F0A2FB52E7601C29181539E1 -:1043B00020AE1422304604F049FA307800281CD090 -:1043C000002020A94E4A7A440B781C09145D05ADE3 -:1043D0002C542C180F251D40535D6370491C801C04 -:1043E0002928F1D3282005AB002119544121454A41 -:1043F0007A44049801F0BEF82AE703200121FD2C3D -:1044000000D00846295C4018295C41180398002810 -:104410000CD0685C0818401C295C00290AD04C2983 -:1044200009D1291849784018801C04E068184078A0 -:10443000891C09E0401C291849784018801C295C17 -:104440000818401C295C491C08182A5C411C4C2A8D -:1044500000D001466C186078A17809020143E07829 -:10446000227912020243100408431F901FA820491A -:104470007944042204F070FB00280DD01FA81E49C7 -:104480007944042204F068FB002800D0E0E61B49D0 -:1044900079440B220498D9E63D68287919AE30702A -:1044A00021461131701C15273A4604F0CFF9A8882F -:1044B00001216A4603C205AD5023304639462A46DB -:1044C000FEF7A2F9002129544420205C69460860C7 -:1044D0004121084A7A4404982B468BE7201D00208E -:1044E0007C1800206A530000BC4D0000A94E00005B -:1044F000F84C0000994C0000084D00002C510000C1 -:10450000C74D0000AE4D0000F0B597B001AD50248E -:104510002846214604F094F94548464F391815A815 -:104520000822FEF7B0F9444838187B2189002A4652 -:104530002346FFF77DFE414E40223046294604F0D7 -:104540003FFBA3208000385C142811D13C48381868 -:1045500040497944042200F0C7FA002808D13948BC -:1045600038183D497944042200F0BEFA00282FD0C3 -:10457000354C374626682736304604F0BFFA0246E7 -:104580003D4641352846314600F08FFA26682736E9 -:10459000304604F0B3FA2021295430463E4604F058 -:1045A000ADFA2818401C83218900224A505015A8D2 -:1045B000FDF7A0FC05462068273004F09FFA281874 -:1045C000401C3018412100224254012017B0F0BD98 -:1045D0001E48381801210022FDF74CFF03463046E3 -:1045E00041301F2B06D0032B07D0012B0BD11B49C9 -:1045F000794404E01A49794401E01A4979440622D1 -:1046000004F024F904E01421174A7A4400F0B2FFC0 -:1046100035464135284604F071FAC4B22819832181 -:10462000890078500A483818FDF764FC2018C8E75C -:10463000820200007C1800208A020000001800207E -:104640008D02000091020000201D00209502000054 -:10465000990200005D4C000063500000C44B000054 -:10466000C44B0000C44B0000BC4B000070B58CB0C4 -:1046700020206946486004AE0E600C4894300C4D12 -:104680002A46413201240023214601F0C3FA68463C -:10469000082306601836436086604121054A7A4443 -:1046A000284600F067FF20460CB070BD7C18002043 -:1046B00000180020374B000010B5252040010D4C9C -:1046C000215C0020002900D010BDFFF71DFF8F20C6 -:1046D000C000205808496158491C0B1A074855303A -:1046E0001421074A7A4400F045FFFCF7FDFC012045 -:1046F00010BDC0467C1800207C040000001800207B -:10470000FD4A0000B0B582B025204001164D285C5E -:10471000A97F01430024002902D0204602B0B0BD89 -:1047200012482A18294615316846FEF740FA002833 -:10473000F3D00F48285C01240328EED100206877CD -:10474000F52040003D21C900695C002907D0295CA3 -:10475000002904D101242C5400202875DDE70A200B -:1047600028750124D9E7C0467C1800208504000084 -:104770008404000080B5FFF779FF0120FDF742FABD -:1047800080BD000010B5044604497A22FEF762F9A4 -:1047900000212046FEF7C8F810BDC04600180020D2 -:1047A00010B5074CC834204604F0A8F92021215444 -:1047B0002018002141700120FCF79CF810BDC04674 -:1047C000E81F002080B5034979440020024603F029 -:1047D000CBF980BD544B000080B5034979440020DB -:1047E000024603F0C1F980BDB04B000080B5054919 -:1047F0007A22FEF72FF9044979440020024603F09B -:10480000B3F980BD00180020384C000080B5054980 -:104810007A22FEF71FF9044979440020024603F08A -:10482000A3F980BD00180020C44C000080B50349E6 -:1048300079440020024603F097F980BD684D0000DE -:1048400010B58CB06C46204604F036F9A0850D49B1 -:10485000084206D1684601F01BFB0A90FF2001F0D8 -:10486000D7FA01F009FB6946884202D10A9801F0A3 -:104870000FFB6846808D002801D10CB010BD00F000 -:1048800049F9C046FFFF0000F0B59FB00446002C78 -:104890002FD10DAC002648222046314600F01BF9EE -:1048A000032525720D9633480E9020460930344971 -:1048B00079440526324603F0C9FF20461730314FB0 -:1048C0007F443946324603F0C1FF2046273039463F -:1048D000324603F0BBFF26462D362B49794430463D -:1048E0002A4603F0B3FF4020112121541A960420D8 -:1048F0001E9021480460214C01200102204603F053 -:104900009FFF01AD284604F0D7F8A88585B2002D99 -:104910000BD001A8002181850B9801F0B9FA0B9802 -:1049200001F0B6FA102DE7D01FE001AD284601F0E6 -:10493000AFFA0B9000F028FAFDF7ECFA002002F035 -:1049400007FF012002F004FFFFF7D0F8FBF746FC59 -:1049500001F092FAA84202D10B9801F099FA01A84D -:10496000808D0028C8D000F0D5F8FFF769FF1FB090 -:10497000F0BDC0463A003200201D0020241D00205A -:104980003C490000314900001A490000F0B59FB0D1 -:104990000446A068002831D10DAD002748222846E2 -:1049A000394600F098F80320009028720D97374898 -:1049B0000E90284609303749794405273A4603F0D6 -:1049C00045FF28461730344E7E4431463A4603F0C0 -:1049D0003DFF2846273031463A4603F037FF2E4642 -:1049E0002D362E4979443046009A03F02FFF40209F -:1049F000112129541A9604201E90A5600027244EE8 -:104A000001AD284604F058F8A885304207D101A826 -:104A100001F03EFA0B90F8070FD001F0D5F901F044 -:104A20002BFA01A9884202D10B9801F031FA01A8B2 -:104A3000808D002828D10127E2E70A2001F0B8F88C -:104A40006068022817D004280BD00328E5D1E0685D -:104A500000218161A168E068FEF78CFFE168886150 -:104A6000DBE7E0680021C162A168E068FEF7B8FFFB -:104A7000E168C862D1E7E068FEF7E8FF0028CCD023 -:104A8000A068FFF713F8C8E700F044F83A003200D6 -:104A9000FFFF0000344800002948000012480000D1 -:104AA00080B5002001F0F4F980BDB0B5884208D986 -:104AB000002A0FD0491E401E8B5C8354521EFBD12E -:104AC00008E0002A06D000239CB20D5D05555B1C52 -:104AD000521EF9D1B0BD80B50B46002A03D0114655 -:104AE0001A4603F0BBFE80BDB0B50023002A0FD0EC -:104AF000401E491E8C5C855C521EA54202D1002AD4 -:104B0000F8D105E00020C0430123A54200D80346A8 -:104B1000D8B2B0BD10B5044601F0AEF9214603F09D -:104B2000D7FF000080B501F08BF9002800D080BDD0 -:104B30000648002141706022027002228270C1701A -:104B40000171052101F070F980BDC046241E0020CE -:104B5000B0B51A48C078032807DC01280DD0022818 -:104B600028D1174802F073F9B0BD04281FD00828D7 -:104B700020D1134802F069F9B0BD114C0121204643 -:104B800002F05EF9204602F03DF90E4CA0790028B3 -:104B900011D120460C30002504222946FFF79BFF47 -:104BA0001034082220462946FFF795FFB0BD04487F -:104BB00002F049F9B0BD1020FFF7ACFF241E002021 -:104BC000FC2100203C2100207F21014000200329FE -:104BD00003D8C8B201490818007B70473C21002067 -:104BE00080B516480179042918D0022906D0012978 -:104BF00022D1811D134802F00DF880BDC2787F21BB -:104C00001140032918D8C9B24A000D4B9A18002345 -:104C10001382821D0B4802F082F880BDC2787F218A -:104C20001140032908D8C9B2054A521843791373B1 -:104C3000821D044802F01CF880BDC046241E0020DE -:104C40003C210020FC21002070B515460E4604468C -:104C5000FF2D1BD80E485021017020210171457194 -:104C6000E91C817080222243C270090A417006212A -:104C700001F0DAF83046294601F0D6F87F202040CE -:104C80004000044908187D210901018270BDC04619 -:104C9000241E00203C21002080B50A4601468220C7 -:104CA0001423FFF7D1FF80BD80B50A46014683205B -:104CB0001423FFF7C9FF80BD80B50C480178002997 -:104CC00000D080BD062181710A21017008498B78CE -:104CD0004A7812021A43FF232A339A4200D31A4613 -:104CE0004280C91C0348FFF7E0FE80BD3C21002044 -:104CF000241E0020E81F0020B0B5204882784178AB -:104D00000902114300780F280ADC0E2810D00F2862 -:104D100023D10020012927D1FFF71AFF0120B0BDC0 -:104D200010281ED0162818D1FFF7C6FF0120B0BDED -:104D300013488168643181601621124A435A002B5E -:104D400008D06424642B1D4600D325465B1B4352C8 -:104D500013420ED0891E0E29F0D10220FEF7BCFFAF -:104D6000B0BD0020032900D2B0BDFFF739FF0120FC -:104D7000B0BD002101701020FFF7CCFE241E0020E2 -:104D80003C210020FFFF0000B0B50A2000F010FF1A -:104D9000084C0025182220462946FFF79CFE658016 -:104DA0002570A571A56000F061FB034805604560B2 -:104DB000B0BDC0463C2100205421002070470000B7 -:104DC00002480021016041607047C0465421002024 -:104DD000F0B589B00546084600F0A0FD0446002C59 -:104DE00043D02069002840D0284600F097FD0146B6 -:104DF00002AD1C2228460192FFF757FE2168E98088 -:104E000062682A81A0681A4F65233B7089B292B20A -:104E10004A434243D1084E1C07231A4200D10E4692 -:104E2000314600910426864070181D30B870000A83 -:104E300078700321384600F0F7FF2846019900F00A -:104E4000F3FFA06838700121384600F0EDFFE068FC -:104E500000F064FDB1B200F0E7FF009885B2206970 -:104E600000F05CFD294600F0DFFF09B0F0BDC04650 -:104E7000241E002070B500F051FD044620787F26E6 -:104E8000064000F0DDFF002830D1002E2ED0E06972 -:104E900000281DD000F042FD0546052E02D1A07E5F -:104EA000002824D0284603F029FE06461248652132 -:104EB000017031461C318170090A4170032100F0F4 -:104EC000B3FF1C21204600F0AFFFB1B228460BE033 -:104ED000094800214170652101701C25857003215E -:104EE00000F0A2FF2046294600F09EFF70BD20463C -:104EF0002946FFF76DFF70BD241E002070B50446E3 -:104F0000002C28D01448066845688E4201D16D1CDB -:104F100045600E43002902D00660324605E00022BB -:104F2000026042600D4B5B1C1E438A4201D000218F -:104F30004160082D0CD30321284603F091FB012288 -:104F400090073043002900D03046D107884300E065 -:104F500030462946A04770BD54210020FFFFFF7F47 -:104F6000F0B581B00F4E01243470B11CFF275037CB -:104F70007A1C204600F03EFF054675707A1B7719B3 -:104F8000F91C022000F036FFB8702D187619F47065 -:104F900000F024FF3071902070710020B071E81D86 -:104FA00001B0F0BDE81F0020F0B58BB00A46064600 -:104FB00007210E4207D03346D8B291B2FEF768FE01 -:104FC00080B20BB0F0BD4B20840083200390AA4D2B -:104FD000A84F3346019109E06920A9490870039858 -:104FE000801C487002220199079B2DE11021304658 -:104FF0000840049292B20592002A069600D1B5E0CC -:10500000002800D0B2E007930091029007E0A1B21F -:105010000022384600F020FF012000F03FF900F0A8 -:105020000FFF0028F3D17D200001A9680E18287811 -:105030000928079A42DC072848D0092863D10021B3 -:105040008E48079101F0F8FB10E0FFF76BFDA1B26D -:105050000022384600F000FFA868B04200D3FEE00E -:10506000FFF74AFE00F0ECFE0028F0D1834801F083 -:1050700039F90028E9D0059AD01D4008A92800D3A5 -:10508000F3E003980D307E4B9854981807994170BF -:10509000581D0499891C8AB205921946FFF705FD2F -:1050A000052277480799FFF716FD0598401D83B242 -:1050B00072480399724A01F0D3FB3FE00A28049931 -:1050C0000AD00B2822D17148784401E06E48784418 -:1050D000059900F035FA31E02046253080B2059E72 -:1050E000864200D9C1E053203870B970080A787040 -:1050F0000321384600F098FE6148314600F094FEE6 -:10510000002028701DE0002800D1ABE0D0B2059946 -:10511000FEF7BEFD002811D0A4E0FFF703FDA1B209 -:105120000022384600F098FEA868B04200D396E00E -:10513000FFF7E2FD00F084FE0028F0D12878002877 -:10514000EBD10020A87128706880069EB10600D5BA -:1051500036E7FFF7E7FC30060298009906D508917C -:1051600008AA484B1846114601DF0298002804D1CE -:1051700070066ED40020A87128700020688000F0AE -:105180005FFE002801D1FFF7CDFCA1B20022384616 -:10519000079200F061FE022806D8B9787A781202E8 -:1051A0000A43D11C81423DD1FFF7A6FD68882978CA -:1051B0000029E4D00028E2D0354979440422304E59 -:1051C0003046FFF791FC00282ED032497944042262 -:1051D0003046FFF789FC00282BD02F497944042260 -:1051E0003046FFF781FC002837D103982730C6B23C -:1051F00000F0D2FDB04200D0EEE60120204E30702B -:10520000B01C402100F0BAFD7070811C184A121DBC -:105210001140039B0D337354C11C11400023735480 -:10522000021D10E00020A7E7FFF79AFE02460023C8 -:1052300009E00020707003980D30307080200699CE -:10524000014302220B460199DEB20B4200D1CDE6AA -:10525000B2E6688806494018B2E66888B0E61020D1 -:10526000FFF758FC0920FFF755FC0220FFF752FC1E -:10527000FBFF0000241E00203C2100205C210020B8 -:10528000E81F0020BE9A0060C7FBFFFFDDFBFFFFA9 -:105290001244000005440000FA43000070B50446C3 -:1052A00000F0CEFD002801D1FFF73CFC4B2081002F -:1052B0000B4E002530462A4600F0CEFD30781528EA -:1052C00006D8012181400748014201D0002C05D1B8 -:1052D000FFF712FD0125002800D10546284670BDC4 -:1052E000241E00202070200010B5FFF71BFC084C86 -:1052F0004B2081000022204600F0AEFD20780E28D1 -:1053000001D0FFF7F9FC00F09BFD0028F0D110BDA3 -:10531000241E0020F0B581B000920F4604464B4E8B -:10532000B74210D0494D0021402628463246FFF7AB -:10533000D2FB00984028024600D332462846394620 -:10534000FFF7B3FB414EB07801280ADC002828D0D3 -:10535000012869D1F01C042100F04EFC40213046A8 -:105360002BE0022827D005285ED13079F178090298 -:105370000143374C2068002781425BD12068002818 -:105380001ED03448009D2918334A13686D1FADB2F2 -:10539000AB4200D21168051D0D4030480068711DF8 -:1053A00034E0F01C002704223946FFF794FB40212B -:1053B0003046A0473EE025484021A047002739E07D -:1053C000B0797179090201432548016001684908F3 -:1053D000A8292FD80168204801607178327812021C -:1053E0000A4320490A601D491F4A0A60009D691F3F -:1053F0008AB218495218D21C0368ED1FADB2AB42F5 -:1054000000D202680D1D1540F11D17482A46FFF70E -:105410004CFB11480168491B01601048016849199B -:1054200001602068401C20600B48016801200227B1 -:10543000002907D10648002101600848016006489C -:1054400001603846C0B201B0F0BDC046A0210020C6 -:10545000E0210020FBFF0000E8210020EC210020DB -:10546000E4210020F0210020E81F00200348002153 -:10547000016003480160034801607047E02100209B -:10548000EC210020E8210020F0B581B0264F3A68D9 -:10549000264C2168002921D0002A1FD00090264DDB -:1054A000002140222846FFF716FB0520A87023485C -:1054B0000168090A2970006868701D490868000AB7 -:1054C000E870086828710968206800290ED03B261A -:1054D0003B2800D826683968681D12E0144800216E -:1054E000016039601348017021601BE039263928BA -:1054F00000D826682068000A68712068A871396899 -:10550000E81D3246FFF7D1FA009A09492068801B4E -:1055100020603868801938600868401C08600648B8 -:105520004021904701B0F0BDEC210020E82100208F -:10553000E02100203C210020A0210020F0210020BB -:1055400080B500290BD0064A00231360054A11607C -:10555000054A064B1360064A1160FFF795FF80BDB0 -:10556000E0210020E8210020EC210020E81F00209D -:10557000E421002081B0F0B58EB015460C460690AF -:105580001393022C00D2BAE10698002800D1B6E1AC -:10559000002D00D1B3E10698214603F051F913A87C -:1055A00009902978002900D1A9E1671E002602E0B0 -:1055B000A8194178761CC8B2002801D02528F7D157 -:1055C000BE4200D33E46069C20462946324603F0A2 -:1055D00041F9BF1BA4190694002F00D18FE1A95DEA -:1055E000AD19252900D087E16B1C002020210A225B -:1055F00008920490059007900446084604E0099933 -:105600000A1D0992096804911D46224629786D1CDD -:1056100000242D29F9D0472918DC2F2926DD0B4637 -:10562000303B0A2B00D366E13029044600D10C46FA -:10563000079B002B00D004460A23079843435818C1 -:10564000303807902B4620461446DDE7672904DDF5 -:10565000722921DD73293AD122E062293CDC4829F4 -:105660004BD1014601200590084617E0252958D066 -:105670002A2926D02E2900D03DE129782A2900D0D8 -:105680003AE16A786B1C01242A21482AB7D0682A9B -:10569000B5D0732AB3D02FE1682936D110210891F3 -:1056A00009990B1D0993032313400968012B00D1AD -:1056B000BBE0022B00D1BAE0032B2B461446A3D04B -:1056C000C6E02978022473292B4698D014E1752965 -:1056D00029D078291CD00EE1632900D19BE06429F0 -:1056E00000D008E1029003970998011D0991006814 -:1056F000C11742184A40C00F1CE0582900D0FAE0F8 -:10570000014601200590084602E0702900D0F2E031 -:10571000029003970998011D099102680020102743 -:1057200009E025207BE0029003970998011D09916B -:10573000026800200A27012497420892049012D898 -:10574000012638460446394602F004FFB04209D12A -:10575000384660430799491E0791089988422646B2 -:10576000F0D900E034460798411E049B002B00D17D -:1057700007990026F243002B029800D11A460192A5 -:10578000C2B2302A06D1002B04D00AA82D23037000 -:1057900000230126881E0D280BD80AA83043491E75 -:1057A000049303F05BF8049B079880190199401853 -:1057B000461E002B03D00AA82D218155761C059882 -:1057C000002C1AD0002802D05348784401E05148F8 -:1057D000784407900898214602F0BCFE394602F052 -:1057E0003FFF0798405C0AA988552046394602F0D9 -:1057F000B1FE761CA7420446ECD9039FBE4200D3FB -:105800003E460AA9069C2046324603F023F8BF1BF9 -:10581000A41906946DE00998011D09910068069984 -:1058200008707F1E491C069163E0049E16E008780C -:10583000002860D10499B94200D339462022069C41 -:105840002046049103F00AF804983F1A24183DE01A -:1058500000228B5C521C002BFBD1561E089810288E -:105860002AD1002E47D000243B46085D0F2202407B -:105870000009022B1F4642D3059B002B05D0012BAC -:105880000ED10794224B7B4402E007941F4B7B44CC -:10589000D2B29A5C069C6270C0B2185C2070079C01 -:1058A0003846871E02282AD0641C0698801C069061 -:1058B000B4423B46D9D30DE0BE4200D33E46069CDF -:1058C0002046324602F0C6FFBF1BA4190694002FE3 -:1058D000079C14D0B4420ED9A41BBC4200D33C4652 -:1058E0002022069E3046214602F0B8FF3F1B3619A3 -:1058F0000696002F03D02978002900D056E6002014 -:105900000EB0F0BC02BC01B00847C0464D3D0000DF -:10591000653D00000B3E0000213E000080B50449BB -:10592000884204D30349884201D200F005F880BDC3 -:105930000000D0C0009DD0C07A460249C91C891A17 -:10594000401A70473959D0C010B54101104A0A4079 -:10595000430E01210B405B420E4C1C405440820E12 -:105960000A4052420C4B13406340C20E0A4052425E -:105970000A4C14405C40020F0A405242084B13404C -:105980006340400F0840414206480840584010BD5F -:10599000E0FFFF3FB2576A3B6D8E5026FA19A11EF9 -:1059A000DD33423DB362142AF0B587B0059304920B -:1059B000064602910D7800270120002D03971BD089 -:1059C0000298401C0690012000272C460197214692 -:1059D0004139E2B2202A5FD3C9B21A295CD3FFF75A -:1059E000B3FF01460698C25DE020044060094840CC -:1059F0007F1C002A1446EAD10599C919C91D5A29E4 -:105A000003994CD8FFF7A0FF002D0ED002994C1C33 -:105A1000FFF79AFF014635701F2028404840611C5F -:105A2000761C2578002D0C46F2D131213170711C85 -:105A300006910599002914D000241A4E7E4403943F -:105A400004990F5D1F2F29D8F55DFFF77DFF06999B -:105A50000D557840641C05998C42F1D306990919BB -:105A600006910624FFF770FF641EFBD10121484018 -:105A700019220D497944069B0446D4401F25254030 -:105A80004C5D1C70541F5B1C002A2246F4D1002080 -:105A900006998871012102E0019900E00399084606 -:105AA00007B0F0BD28330000F0320000F0B595B02B -:105AB0000C46054600200390102A1EDC1A99002A85 -:105AC00003D08E1E262E04D917E0142901D02029D8 -:105AD00013D104AE327001206A46082782C21060DA -:105AE000701C03A9052200F00AF80398431C0393D5 -:105AF000284621463246FFF757FF15B0F0BDF0B5F6 -:105B000087B00493019105461046012383405C1E33 -:105B100000270E9900910D9902910C9A002A3E4699 -:105B200027D04142059100263746029976188F40CA -:105B300004990B781F43491C0491521E039286421C -:105B4000069712DB01990B68024620465C1C0C602C -:105B5000059CA4192F46069DE540044610462540A5 -:105B6000FD543D46361A8642EDDA039A002A069F16 -:105B7000DBD1009900290CD0002E13D001990B68BD -:105B8000024620465C1C0C60911B8F400740EF547E -:105B900008E0811B8F40274000210298864202DAEC -:105BA000002F00D10121084607B0F0BD01DF70478A -:105BB00080B584B00190034801A9FFF7F7FF04B056 -:105BC00080BDC0463701006080B582B0024869469A -:105BD000FFF7ECFF02B080BD3C02006080B586B0EC -:105BE000019002910392034801A9FFF7DFFF06B07D -:105BF00080BDC0467F03006080B584B000900191F5 -:105C000003486946FFF7D2FF019804B080BDC04643 -:105C10002C05006080B588B000900191029203933A -:105C20000A9804900B98059003486946FFF7BEFF59 -:105C3000019808B080BDC0463B07006080B584B0C5 -:105C40000190034801A9FFF7B1FF029804B080BD9D -:105C50007F08006080B584B00190034801A9FFF778 -:105C6000A5FF029804B080BDDB0A006080B586B055 -:105C7000009001910292039303486946FFF796FF53 -:105C8000019806B080BDC0462C0B006080B588B07E -:105C900000900191029203930A9804900B9805904A -:105CA00003486946FFF782FF019808B080BDC046EF -:105CB0002B1A006080B586B0009001910292039388 -:105CC00003486946FFF772FF019806B080BDC046E1 -:105CD000EA2E006080B586B0009001910292039395 -:105CE00003486946FFF762FF019806B080BDC046D1 -:105CF0002E2F006080B58AB000900191029203932C -:105D00000C9804900D9805900E9806900F980790A7 -:105D100003486946FFF74AFF01980AB080BDC046B4 -:105D2000F338006080B586B0019002910392044878 -:105D300001A9FFF73BFF029880B206B080BDC046C4 -:105D40006E92006080B582B003486946FFF72EFF6F -:105D50000198C0B202B080BD4F9F006080B588B08E -:105D600001900291039204930A980590024801A9B8 -:105D7000FFF71CFF08B080BDBA53006080B584B047 -:105D80000090019103486946FFF710FF019804B0A5 -:105D900080BDC046FCA8006080B582B0034869465B -:105DA000FFF704FF0198C0B202B080BD3CA00060C4 -:105DB00080B584B00190034801A9FFF7F7FE02986F -:105DC00004B080BD5864006080B582B00248694666 -:105DD000FFF7ECFE02B080BD8D68006080B582B038 -:105DE00003486946FFF7E2FE019802B080BDC04655 -:105DF0006E6A006080B586B00190029103920348FC -:105E000001A9FFF7D3FE029806B080BDD4740060EC -:105E100080B584B00190034801A9FFF7C7FE04B024 -:105E200080BDC046BE9A006080B584B000900191EC -:105E300002486946FFF7BAFE04B080BD8183006066 -:105E400080B582B003486946FFF7B0FE019802B002 -:105E500080BDC046BB84006080B586B001900291D1 -:105E60000392044801A9FFF7A1FE029880B206B090 -:105E700080BDC046E485006080B582B003486946B5 -:105E8000FFF794FE019802B080BDC046B187006064 -:105E900080B584B00190034801A9FFF787FE0298FE -:105EA00004B080BD7588006080B584B0019004485E -:105EB00001A9FFF77BFE0298C0B204B080BDC046C6 -:105EC0008B9C0060F0B585B03A4A1278002A03D066 -:105ED00083213A4A7A440BE00A9A452A03D883215F -:105EE000374A7A4404E0072907D18321354A7A44A6 -:105EF000022300F0B5FC05B0F0BD019202904020F5 -:105F00000393185C0490002822D004980528039D70 -:105F100008D1284641302C4979440522FEF7E4FD9A -:105F2000002833D041350027284E7E44049C0321AD -:105F3000384602F00FFB0221C9434143705C2978C7 -:105F400041402970641E761C6D1C7F1C002CEED114 -:105F500045200399085C4630019A904210D14131A6 -:105F60001548049C2246FEF7A0FD072011498871C0 -:105F70004C80092008700121029800F05DFCBAE70E -:105F80008321134A7A4402230298B2E70A4D03227E -:105F90002A70681C0F497944FEF787FD281D0E49B9 -:105FA00079440422FEF781FD2878431D832102985D -:105FB0002A469EE73C210020E81F002029370000E8 -:105FC0001D37000013370000EB360000DF360000FD -:105FD0008E360000733600006D360000F0B581B0DB -:105FE0001D460E460446284600F016FC00280ED03A -:105FF0002068C11C090A6A469170811C090C517005 -:10600000411C090E1170001D2060D07004E068462C -:1060100004222946FEF749FD174F0822384631462B -:10602000FEF743FD3846083069460422FEF73DFD81 -:1060300000207873022139730121B973F873387421 -:10604000284600F0E9FB0146201D8625002906D0E0 -:1060500029467931C9B20422FEF73DFD03E06946C5 -:106060000422FEF722FD044A11232046294600F0AF -:10607000F7FB01B0F0BDC046E81F0020F0B583B0CB -:10608000029088794B791F020743887801904B78FA -:106090000E781546093DACB2A74204D0D01FD21FDE -:1060A00092B297421BD13D46002E08D083211C4A54 -:1060B0007A440223029800F0D3FB03B0F0BD022B18 -:1060C00018DC012B23D0022B1DD1A8B26A46106028 -:1060D000CB1D002202980199FFF7F4FEEDE7E4B230 -:1060E000A742E1D0D2B297420546DDD083210D4AC6 -:1060F0007A44DEE7032B0ED0C12B04D183210A4A58 -:106100007A440423D6E783210A4A7A44D1E78321DB -:10611000064A7A44CDE78321054A7A440823C9E731 -:10612000703500000F3500001C350000E934000018 -:10613000FA3400001835000080B5C1698A784B78C0 -:106140001B0213430A78812A09D0832A0CD0862A9D -:106150000ED1C91C031D0022FFF740FF80BDCA1CE1 -:10616000812100F07DFB80BDC91C1A46FFF786FF28 -:1061700080BD000070B50D460146012A11D1094CC1 -:1061800020462A46FEF791FC60194026721B002526 -:106190002946FEF7A0FC8120214632462B46FEF719 -:1061A00053FD70BDA02100200282C1600022C28286 -:1061B000827642858284C16102627047F0B583B005 -:1061C0000D4604462A20215C20462A3001294AD067 -:1061D00000293BD12B210022625423462B33202758 -:1061E000E15DC91EC9B22646203601293ED8218B61 -:1061F000E28A91423CD94020012D00D038460290DD -:10620000A07E03230126002800D033460027012D5D -:106210003E4600D12E46B60033431E46029B9B1BD2 -:10622000891A1A46914200DC0A4691190291012D01 -:1062300008D1211D2A48042701923A46FEF735FC71 -:10624000019AA07E002820D0FF302BE02521615C40 -:10625000062908D12B21625C0023635423462B338B -:10626000002A03D1BBE72B200021215403B0F0BD4D -:10627000FCD10021A176E18219700170B1803160FA -:10628000E068E06115480170F0E74020205CB9B299 -:10629000134B58540120384381B2637E104F7B5416 -:1062A000471C207EB9B20E4B5854E169002907D033 -:1062B0001746BAB29819E38AC918FEF7F6FB3A46B0 -:1062C000E08A1018E082A07E401CA076029881B27D -:1062D00003482A46FFF74EFFC8E7C0463C2100208E -:1062E000A021002001462A200A5C0120002A10D0AB -:1062F000012A01D100200CE025200A5C0020062A9A -:1063000007D12B200A5C01200021002A01D0084679 -:1063100070477047B0B52B2101244454011D0B4D2B -:1063200004222846FEF7C1FB0020687183202871F3 -:106330000220A8716920E8717C20C043801C28726B -:10634000092128462246FFF715FFB0BDA0210020F5 -:10635000B0B52B2101244454011D084D04222846C8 -:10636000FEF7A3FB0020687188212971A87107211D -:1063700028462246FFF7FEFEB0BDC046A021002001 -:10638000F0B581B004462520205C26462536002540 -:1063900005286AD008784B781B0203438878CD78AB -:1063A0002D02054328041843237965792D021D43E6 -:1063B000A379E7793F021F433B042B43834257D124 -:1063C00008790B1D658C002D13D02423E75C234630 -:1063D0002433B8424CD1278B401C18707B1B501FB4 -:1063E000984200DB18464219628482B2208D491D12 -:1063F00023E07C25ED436D1DEFB28325B84204D127 -:106400002046FFF7A5FF01252FE08F794979090282 -:106410003943C91CA8422BD1208B8DB2A84227D169 -:1064200089B2164D24270020E055121F8A4200DB56 -:106430000A466284154019462A46FFF773FC2085F8 -:10644000218B628C01258A420FD3E18C88420FD1C7 -:1064500006203070002060842A20205C012804D1AE -:106460002046FFF757FF00203070284601B0F0BDEE -:10647000052030701020FEF74DFBC046FFFF0000E6 -:10648000F0B589B0044623722020205C26462036D1 -:1064900003280AD02A25675D25462A35002F1BD000 -:1064A0002046FFF76DFF002814D1D748062101725E -:1064B000042131707A21C9433A314022A154083075 -:1064C000E0610020A076E08201202083217A20462E -:1064D000FFF774FE09B0F0BD042809D12B20002776 -:1064E0002754A776E7822F70B7803760E068E061B5 -:1064F00008910020012B00D1184687000120394661 -:106500000143079191423BD80390012B06930492DB -:10651000059707D1201D04220899FEF7C6FA059FAA -:10652000049A069BE08A00280CD0012B24D1204637 -:106530001230211D0422FEF7D7FA059F049A069B0C -:10654000002819D0032138460843904218D80091FA -:106550000899C8190290C8570F467A21C9437A3161 -:1065600049B28525884225DDA74804210172317092 -:106570003A3540216554A2E702203843904202D9BF -:10658000A148852193E72120205C984246D13078AC -:10659000012851D1012B7FD1211D0422089803929B -:1065A000FEF7A2FA059F002876D0974806210172CF -:1065B00003997EE70195012B14D1307801281ED173 -:1065C000251D2146123104222846FEF78DFA069B2E -:1065D000002807D0029800780199491CC9B2884266 -:1065E00000D0E8E03078012809D1012B00D080E00C -:1065F000029800780199491CC9B2884279D107995B -:1066000078184078795C0F020743208AC01E8742C1 -:106610001FDD7D480099017204216DE07A20C0439E -:1066200001460831784A1172042131703A30402114 -:1066300060540832E26144E7012B56D12B2000213F -:106640002154A176E1822970B1803160E068E06177 -:1066500040E702980078812805D08628019D51D016 -:10666000832800D097E0012B57D1251D6749794435 -:10667000042228460892FEF737FA002807D064491A -:10668000794404222846FEF72FFA002845D15E48B7 -:106690000B21017208992FE0089AD119D05DA27ED2 -:1066A000904222D10498079A851AE08A228B121A06 -:1066B000954200DB1546AFB2E2691018491C3A4614 -:1066C000FEF7F3F90699012908D1E08AE169091872 -:1066D000E08C3A46FFF726FB0699E084E08A28180A -:1066E000E082A07E401CA0763CE047480421017275 -:1066F000DFE64548042101723170019A3A324021A7 -:106700006254DCE6012B6AD1201D424979440425FC -:106710002A46FEF7E9F9002870D004980599451A31 -:10672000FF1CBD4200DB3D46AAB2E0690299089217 -:10673000FEF7BBF9069B012B06D1E1690020089A00 -:10674000FFF7F0FA069BE084212023542783E5829B -:106750000020A07620461230211D04221D46FEF79F -:10676000A4F92946E08A012901D1218B06E0218B79 -:10677000CA1C824202D22448032198E6884204D2ED -:106780000020606301203070A4E6022030702046B3 -:10679000FFF7D2FC9EE61C48039B03720421317074 -:1067A000019A3A32402162540830E0610020A0761C -:1067B000E08223838AE6144C042220462946FEF711 -:1067C00074F90020607101983A302071039AA27127 -:1067D0000620E07108212046FFF7CCFC7AE60A4843 -:1067E000039A0272042131703A3540216554083011 -:1067F000E0610020A076E082228367E602480B2158 -:106800000172357079E7C046A0210020B62F000044 -:10681000A82F00001C2F000080B5064979440422EF -:10682000FEF762F9014601200022002900D010463F -:1068300080BDC046082E000080B52A22835C024637 -:106840002A32002906D0002B08D101211170FFF750 -:1068500061FD80BD012B01D10220107080BD0000C0 -:1068600070B504462A20205C002809D0012824D0D5 -:106870002520205C062820D12B20205C00281CD15C -:10688000202003252554402021540020A076E261D9 -:10689000E08223832120215C2546213503290DD167 -:1068A000084E3078002808D0032100E029782046DF -:1068B000FFF784FC30780028F8D170BD2046FFF740 -:1068C0007DFC70BD3C210020024900200860024987 -:1068D00008607047F8210020F421002010B5074817 -:1068E000002444704F210170012181700221C17088 -:1068F0000421FFF799FA204610BDC046241E00204F -:1069000070B582B06D4600246C704F262E70022048 -:10691000A8700320E8702C7105212846FFF784FA3F -:106920006C702E700120A870E87004212846FFF7D3 -:106930007BFA204602B070BD10B582B001A80024D9 -:1069400044704F210170012181700221C170042126 -:10695000FFF76AFA204602B010BD0000B0B582B061 -:10696000144800240460144804606D464F202870C9 -:106970006C700520A8700420E870012028716971EE -:10698000AC71012A05DC002A0AD0012A0AD10420B0 -:1069900006E0022A03D0032A04D1022000E00320EB -:1069A000694688716846C3710821FFF73DFA0020E7 -:1069B00002B0B0BDF8210020F421002010B582B053 -:1069C0006846002444704F2202700522827004221F -:1069D000C2700122027141718471C4710821FFF7F4 -:1069E00023FA204602B010BDB0B582B00D4668460D -:1069F000002444705021017003218170C570402132 -:106A0000017144710621FFF70FFA8020054201D081 -:106A1000074800E0054801687F2215400122AA408E -:106A20000A430260204602B0B0BDC046F8210020F3 -:106A3000F421002070B582B00D46684600244470F1 -:106A40005021017003218170C57080260671447148 -:106A50000621FFF7E9F9354201D0074800E0054873 -:106A600001687F2215400122AA409143016020461F -:106A700002B070BDF8210020F421002080200142E6 -:106A800001D0064800E0044802787F200140012040 -:106A9000884010407047C046F8210020F4210020B3 -:106AA00010B582B06846002444704F220270022262 -:106AB00082700322C27001710521FFF7B5F92046EB -:106AC00002B010BDB0B582B01C46154668465022D3 -:106AD0000270C170202101714471E11C8170090AAA -:106AE00041700621FFF7A0F928462146FFF79CF9DF -:106AF000002002B0B0BD10B582B0684600244470DA -:106B00005023037003238370C170302101714271DF -:106B10000621FFF789F9204602B010BD70B5154671 -:106B20000E4604460220002C0FD0D421204601F04E -:106B300087FE002E01D0B02026509C200121215438 -:106B400025702046FFF7C0FE0020C0B270BDB0B572 -:106B500004469C2001212154B4256059002806D008 -:106B60004068FEF7DBFE0246217920469047083553 -:106B7000CC2DF2D12046FFF7DFFE2046FFF7AEFE18 -:106B80000020B0BD0223002A07D00023022804D829 -:106B9000C0000818B42142500023D8B2704780B515 -:106BA000FFF7AEFE002080BDF0B581B00C46054673 -:106BB0000026B4272846314600F066F9002807D0A1 -:106BC000E8590068FEF7AAFE02462846214690478B -:106BD0000837761C032EEDD1002001B0F0BDF0B5D2 -:106BE00081B00C4605460026B4272846314600F001 -:106BF0004BF9002807D0E8594068FEF78FFE02469F -:106C00002846214690470837761C032EEDD10020F8 -:106C100001B0F0BDB0B504462546A835284600F0C1 -:106C200077FB942001212150AE20205A98216050FA -:106C3000A820215C1F200840022808D001280BD082 -:106C400000280ED12046294600F02BF90EE0204600 -:106C5000294600F0D8FA09E02046294600F0AFFAAC -:106C600004E0802001402046FFF7BEFE0020B0BDBA -:106C7000F0B583B002920446019100291CD025464C -:106C80009C350027B4262046394600F0FDF8002840 -:106C90000DD0A0598069002809D02978032906D190 -:106CA000FEF73CFE034620460199029A98470836B3 -:106CB0007F1C032FE7D12FE09420205803282BD1ED -:106CC000E16D206E81420AD9091AE165814200D343 -:106CD00001468AB22046029900F0C7FD1CE0264614 -:106CE0009C360025B4272046294600F0CDF8002820 -:106CF0000BD0E0590069002807D03178032904D16E -:106D0000FEF70CFE01462046884708376D1C032D10 -:106D1000E9D1204600F0B0FD002003B0F0BDF0B591 -:106D200081B00446009100291BD027469C370026DD -:106D3000B4252046314600F0A7F800280CD0605951 -:106D40004069002808D03978032905D1FEF7E6FD0F -:106D500002462046009990470835761C032EE8D15C -:106D60004DE094202058022842D1E069266AB042C2 -:106D70000AD9D022A1588919A150801BE06182B2A2 -:106D8000204600F064FD33E0A5692846314601F055 -:106D900067FCB5420FD300290DD198202058264614 -:106DA0009836854207D20025204629462A4600F01B -:106DB0004EFD35601CE026469C360025B427204653 -:106DC000294600F061F800280BD0E059C06800287F -:106DD00007D03178032904D1FEF7A0FD01462046F3 -:106DE000884708376D1C032DE9D1204600F050FD7F -:106DF000A020205CA034012801D1002020700020B8 -:106E000001B0F0BD70B504469C2001212154402002 -:106E1000206220660025B4262046294600F034F87A -:106E2000002807D0A0594068FEF778FD0246217976 -:106E30002046904708366D1C032DEDD1002070BD13 -:106E4000017400207047002070470020704770B523 -:106E500004469C20205C032814D10025B42620463B -:106E6000294600F011F8002808D0A059C069002870 -:106E700004D0FEF753FD01462046884708366D1CB6 -:106E8000032DECD1002070BD02460020022907D856 -:106E9000C8001018B42141580120002900D108462B -:106EA000704780B54A78042A08DD072A0FDC052AD6 -:106EB00014D0062A1BD100F021F81DE0002A10D0C2 -:106EC000012A17D0032A12D100F034F914E0082A5D -:106ED0000AD0092A0BD100F0BDF80DE000F094F8BB -:106EE0000AE000F005F907E000F0EBF804E000F03C -:106EF000E3FB01E000F03BF9002080BDB0B582B0BB -:106F00000D46044601A8002101806A88100A052860 -:106F100012DC01281CD0022824D0032837D1D0B29B -:106F2000022839DC00285FD0012865D002282ED144 -:106F3000B0202058C0680EE006281CD0072823D0B7 -:106F40000F2824D1B0202058C069002803D11EE0AA -:106F5000B02020580068FEF7E1FC0246207C01A921 -:106F600090472FE0B420205800282CD0217C002905 -:106F700022D0C06A21E0207C002808D1B42020580B -:106F8000002804D0406B18E0207C00280ED020465A -:106F9000294600F091FB25E0032829D004282FD0B2 -:106FA0000528F4D1B02020588069D4E7B4202058B7 -:106FB0000028ECD0006B00E0806AFEF7AFFC0146D1 -:106FC00001A88847014601A80288002A0AD0E8885B -:106FD000002807D0824200D3024601A80280204642 -:106FE00000F020FC02B0B0BDB02020584068B2E7ED -:106FF000B02020580069AEE7B02020588068AAE78A -:10700000B02020584069A6E770B50446888800285B -:107010000BD1C888002808D148887F2606409C20CC -:10702000205C25469C35032803D1204600F044FB14 -:1070300070BD9E202654F1B22046FFF731FD204658 -:1070400000F01AFC002E02D00220287070BD012032 -:10705000287070BD70B50D460446AE78022E1DD264 -:107060009C20215C20469C30032907D0022915D1A1 -:10707000002E22D066600321017009E0002E12D09C -:107080006068B04219D0C1B22046FFF7A8FD666023 -:1070900020463146FFF788FD02280ED120462946BA -:1070A00000F00AFB70BD0221017066602046314687 -:1070B000FFF795FD204600F0DFFB204600F0DCFBEB -:1070C00070BD80B5CA88012A0AD19C22825C032A3D -:1070D00009D0022A04D1002181600146083103E071 -:1070E00000F0EAFA80BD011D012200F09BFB80BD8B -:1070F000B0B504469C20205CFE220240022A15D135 -:107100000120E060A420215825460C3503200029E9 -:1071100005D0204600F0BCFBE16802200843E06097 -:1071200002222046294600F07DFBB0BD204600F03B -:10713000C3FAB0BDB0B50D4604466888012815D124 -:10714000A42001212150287902280CD8C000201841 -:10715000B4214058002806D08068FEF7DFFB0246C5 -:10716000204629469047204600F086FBB0BDB0B5CA -:107170000D4604469C20205CFE210140022919D1C5 -:10718000688801281AD1A4200021215028790228DA -:107190000CD8C0002018B4214058002806D08068C0 -:1071A000FEF7BCFB0246204629469047204600F0E9 -:1071B00063FBB0BD2046294600F07EFAB0BDB0B5F5 -:1071C0000D4604469C20205C032816D1287902280D -:1071D00013D8C0002018B421405800280DD0806872 -:1071E000FEF79CFB0246204629469047E888002887 -:1071F00007D1204600F040FB03E02046294600F07E -:107200005BFA0020B0BDB0B50D4604462878602278 -:1072100002402979202A0FD102290DD8C800201850 -:10722000B4228058002807D08068FEF777FB02461A -:1072300020462946904769E06878002816D0012842 -:107240001DD0032862D19C20205C03281BD16888B4 -:10725000002807D180200843802803D02046FFF76C -:10726000C3FB297902294ED8C80040E09C20205C4D -:10727000032817D0022810D148060AD146E09C20E6 -:10728000205C032827D0022807D1802008438028CB -:107290003CD02046FFF7A8FB38E02046294600F006 -:1072A0000BFA33E07F2008400001201805465435D2 -:1072B00014308022114200D005462046FFF7DEFB45 -:1072C0000121002800D101462960022220462946DA -:1072D00000F0A8FA1AE06888002817D1480612D0F2 -:1072E0002046FFF7A7FB287902280CD8C0002018F9 -:1072F000B4214058002806D08068FEF70FFB0246F4 -:10730000204629469047204600F0B6FA0020B0BD3E -:107310000A7802704A7842708A78CB781B0213434D -:1073200043800A794B791B02134383808A79C97998 -:1073300009021143C180704710B504468021FFF750 -:1073400053FB00212046FFF74FFB10BD70B582B004 -:107350000D46044601A900200880694608702A7875 -:1073600060211140002910D0202938D169780A46BF -:107370000A3A022A33D302291BD0032919D0204606 -:10738000294600F099F9022029E069780B2913D0E9 -:107390000A290ED0062922D16888000A0022212855 -:1073A0000ED02228114616D101AE304600F058F812 -:1073B0000AE0694601220EE0204600F05DFA0DE089 -:1073C00001AE304600F032F801463288E888824249 -:1073D00000D302463280204600F024FA0020C0B2DA -:1073E00002B070BDF0B581B004468221032640256D -:1073F00032462B46FFF7B2FA02272046394632467C -:107400002B46FFF7ABFA204639462A46FFF773FBB7 -:10741000002001B0F0BD10B504468221FFF7CEFA7E -:1074200002212046FFF7CAFA002010BDAC21094A0C -:10743000515C0922012905D0002906D10749794468 -:10744000092204E00449794401E000221146028047 -:1074500008467047FC210020E6210000FA210000C8 -:10746000F0B581B00446AC201349085C2221002805 -:1074700019D001281AD110488121032740263A4605 -:107480003346FFF76BFA01250B4829463A46334647 -:10749000FFF764FA084829463246FFF72CFB0848F4 -:1074A0007844222104E00548784401E000210846A0 -:1074B000218001B0F0BDC046FC210020BB210000AE -:1074C000A1210000F0B581B00446812103264025AA -:1074D00032462B46FFF742FA01272046394632460C -:1074E0002B46FFF73BFA204639462A46FFF703FBB7 -:1074F000002001B0F0BD000080B5012903D1034890 -:107500000121FEF75BFE002080BDC0465C2100200B -:10751000B0B5144601290DD1012540222946FFF7B7 -:10752000EAFA2846FDF750FB0246034821462B465F -:10753000FEF7A6FF0020B0BD5C21002080B5022927 -:1075400003D103487844FDF79FFF002080BDC0466B -:1075500051D7FFFFB0B51446022919D102214022AC -:10756000FFF7C9FA0B4DA879002811D10220FDF7C9 -:107570002BFB0246094878442146FDF7CBFE022842 -:1075800006D1072028700120A87103480068688090 -:107590000020B0BD3C210020E42100201FD7FFFFC8 -:1075A00070B504468321032540262A463346FFF75B -:1075B000D5F9204629462A463346FFF7CFF920461B -:1075C00029463246FFF797FA002070BD0020704729 -:1075D0000020704780B5032903D103487844FDF7A4 -:1075E00053FF002080BDC046C9D6FFFFB0B514468A -:1075F000032919D103214022FFF77DFA0B4DA87909 -:10760000002811D10320FDF7DFFA0246094878442B -:107610002146FDF77FFE022806D10B2028700520A9 -:10762000A8710348006868800020B0BD3C2100209C -:10763000E421002097D6FFFF1220088001487844FB -:107640007047C046CA2200000420088001487844E0 -:107650007047C046CC2200000E20088001487844C4 -:107660007047C046C02200000E20088001487844C0 -:107670007047C046BE2200000A20088001487844B6 -:107680007047C046BC2200000E20088001487844A4 -:107690007047C0469E2200000E20088001487844B2 -:1076A0007047C0468E220000392008800148784487 -:1076B0007047C046D71F000080B50A7852B2002A32 -:1076C00002DBFFF739FE80BD4A78772A0FD0062A01 -:1076D000F7D14A88194B9A42F3D1CA881221122A4B -:1076E00000D30A461649794400F09CF880BD8A8888 -:1076F000042A09D1CA882821282A00D30A46114918 -:10770000794400F08FF880BD8A88052A09D1CA889B -:107710009221922A00D30A460B49794400F082F85C -:1077200080BD8A88072ACCD1CA88B221B22A00D368 -:107730000A460649794400F075F880BDEE03000062 -:10774000FA1F0000F21F0000002000007820000057 -:1077500070B5044623480025D4222946FDF7BBF91D -:10776000214E30460C3004222946FDF7B4F910367C -:10777000082230462946FDF7AEF9002C2DD0194CD1 -:107780000025D42220462946FDF7A5F91949794458 -:1077900020462A46FFF7C2F9174A7A44284621466E -:1077A000FFF7F0F90120154A7A442146FFF7EAF97C -:1077B000FF2252320D480E49FEF7F6FC0220104A15 -:1077C0007A442146FFF7DEF9032140222046FFF7E5 -:1077D00092F92046FFF7E3F970BD0248FFF7B7F9C9 -:1077E00070BDC046FC2100203C2100205C2100200F -:1077F000E81F0020321F0000C6200000F02000001B -:107800001021000060210180014878447047C04683 -:107810003A2100000A210180014878447047C0469F -:107820008A210000B0B50C46942102234350D02198 -:1078300044508261C261016A914200D80A4693B203 -:10784000002529462246FFF73DF92846B0BDB0B5D0 -:107850000C46016A914200D80A4693B20025294697 -:107860002246FFF72FF92846B0BD10B50024214667 -:10787000FFF741F9204610BD10B594210422425073 -:107880000024214622462346FFF71CF9204610BD5E -:1078900010B5942105224250002421462246FFF7CC -:1078A0002AF9204610BD0000B0B512490A7801201F -:1078B000012A1DD8521E0C235343CB181A8B002AC1 -:1078C00016D01969002913D09B8A002B06D1940089 -:1078D0000C190325ED436459E41C09D1934206D2E7 -:1078E0009A0089180322D2438958891C00D00020AD -:1078F000B0BDC046241D002010B50E490A780120F5 -:10790000012A16D8521E0C235343CB181A8B002A77 -:107910000FD0196900290CD09B8A541E9C4208DDA7 -:10792000921E9A4204DD9A0089184968891C00D089 -:10793000002010BD241D00200848017800290AD02D -:107940000C224A4380184189028901208A4203D8C7 -:10795000FF208A4200D3002040B27047241D00203F -:10796000F0B581B00146164A1078012826D8401E8D -:107970000C234343D218168B002E1FD01569002DFF -:107980001CD0022E1AD3948A13461433771EA742B2 -:1079900014DDB61EA6420ADBA600AD196D68AE1C4A -:1079A0000CD0ED1C03D100211980D18204E0D482D7 -:1079B000621C1A80002901D000F03EF801B0F0BD31 -:1079C000241D002080B50120FFF7CAFF80BD000004 -:1079D000B0B517490878012829D8401E0C22424327 -:1079E00089180A8B002A22D00C69002C1FD0022A89 -:1079F0001DD38D8A0B461433002D0AD0AA00A2187D -:107A00000324E4431259921C11D0CD82691E1980BF -:107A10000BE0950064190325ED436459E41C06D17D -:107A2000044C14191C80521ECA8200F005F8B0BD27 -:107A3000241D0020FEFF0000F0B581B004460C209C -:107A400060431A490E183069B18A89004058374698 -:107A5000143710360321C943884224D8FDF75EFF4E -:107A600031683A889200895805680846FDF756FF44 -:107A7000002D06D00068FDF751FF014620468847DB -:107A800011E08068FDF74AFF0546306839888900B3 -:107A90004058FDF743FF4068FDF740FF024620468F -:107AA000294600F061F801B0F0BDC046241D002059 -:107AB000F0B581B02B4D2878012825D8401E0C2622 -:107AC00070432A18108B00281ED0116900291BD082 -:107AD000928A824218D290000858FDF71FFF8068F2 -:107AE00029784C1E6643002810D0A8190169808AA5 -:107AF00080000858FDF712FF8068FDF70FFF014670 -:107B00000022204600F030F801B0F0BDA819038B28 -:107B1000002BF9D0828A014614319B1E9342F3DB7D -:107B200005699600AE1900967768FE1C13D0BE1C3E -:107B3000EAD1009E7668B61C09D1521C96B2B342B7 -:107B400004DBB600AE197668B61CF6D00A80C28295 -:107B5000501C088002E000220A80C2822046FFF703 -:107B60006BFFD1E7241D0020F0B583B001920C46D5 -:107B70000C221146029041431F4B5F1800213983AC -:107B800039617961181DFCF7A6FF20463C46103488 -:107B90003D4618353E461636143700282AD0FDF7E4 -:107BA000BDFE206029888A008258521C06D0491CDC -:107BB0008AB292008258521CF9D12980019800287B -:107BC00015D0FDF7ABFE054620683988890040587E -:107BD0000BE0FDF7A3FEA84209D038883080401C96 -:107BE000388080B2800021680858411CF1D1029889 -:107BF000FFF722FF03B0F0BD241D002080B50A4925 -:107C0000884208D00949884208D00949884208D1E9 -:107C1000FFF7DEFE05E0FFF74BFF02E00120FFF774 -:107C20009FFE002080BDC04603000080020000804F -:107C30000100008010B50146002000290FD1084C3A -:107C4000218BA28A8A420AD22069FDF767FEA18AA7 -:107C500089004058FDF762FE4068FDF75FFE10BDE9 -:107C6000241D002080B503480078401EFFF7E2FF86 -:107C700080BDC046241D002010B5044600F00CFC59 -:107C80002420604308490818C42105224254C02119 -:107C9000064A7A444250BD2101224254D021044A6E -:107CA0007A44425010BDC046241D00201E1D000015 -:107CB00059FFFFFF80B500F0FFFA9D22002806D093 -:107CC00003498A5C112A02D1B422024B8B5280BD37 -:107CD000241D00200A80000010B50446FFF7CCFFE9 -:107CE0002420604304490818CC21044A7A444250B5 -:107CF000204600F0A7FB10BD241D0020C5FFFFFF9C -:107D000080B500F0D9FA9D22002806D003498A5C8C -:107D1000102A02D3B422024B8B5280BD241D0020B6 -:107D20000A80000010B50446FFF7A6FF2420604338 -:107D300004490818CC21044A7A444250204600F0F5 -:107D400081FB10BD241D0020C5FFFFFF70B5054657 -:107D5000FFF788FF0446114E30469C30202229460A -:107D6000FCF7A3FE68780146103905290AD29D2048 -:107D7000305C0F21014088002058B82170509C369B -:107D8000304670BD022803D00128F8D1616800E0B8 -:107D9000E16800200029F2D1F3E7C046241D00204D -:107DA00010B5044600F078FB242060430B49081806 -:107DB000C42106224254C021094A7A444250BD21BE -:107DC00001224254CC21074A7A444250D021064A2B -:107DD0007A444250204600F035FB10BD241D00209F -:107DE000961C000081FFFFFF29FEFFFFF0B587B062 -:107DF0000E46FFF71FFF06904B4C20460C30002527 -:107E0000022729463A46FCF766FE20460E300595C5 -:107E100029463A46FCF75FFE701C049002D0A06829 -:107E200000287DD006984068FDF778FD054600F0F3 -:107E300065FE291801220592012871DB6068059012 -:107E4000A068029000200390069001952B468B427B -:107E5000039C1A4620D200201A46044626469D1945 -:107E6000C01D741C722813D82F781F2F04DD202FFB -:107E700009D02D2F07D003E0092F04D00A2F09D0F5 -:107E80005F2F00D015462A461D198D42E6D303E028 -:107E9000344601E09A19741C1819884224D2002C27 -:107EA000069D22D09A4220D00025ED43455D2C2D21 -:107EB00006DC2E46093E022E16D3202D14D003E0F8 -:107EC0002D2D11D05F2D0FD000782C2805DC054614 -:107ED000093D022D08D3202802E02D2804D05F2878 -:107EE000069D02D0D41A00E0069D0498002806D012 -:107EF0000598A84203D10598029A90420AD31B190B -:107F0000681C8B4200D328468B4206909FD3401CAE -:107F1000059005E004480146CC810198181A888133 -:107F2000059807B0F0BDC046241D0020B0B504463A -:107F3000FFF7A2FE094D69682046FFF757FF24208E -:107F400060432818CC21064A7A444250D021054A81 -:107F50007A444250204600F075FAB0BD241D00203E -:107F60001D00000015010000F0B583B00546FFF7C5 -:107F700079FE0446374E30469C3020222946FCF7D5 -:107F800094FD6878102816DC012833D002283BD0F5 -:107F900010285AD12068002841D0B468FDF7BEFCF3 -:107FA00003467068B1686A46401C03C2012C41D880 -:107FB0002A4A7A4440E001461139032945D20F216B -:107FC0000840401E40003718FD89002D3DD06068F4 -:107FD000FDF7A4FCB98940186946086034461C3492 -:107FE0008021204A7A4420462B46FDF7C3FAB82068 -:107FF00034502AE0FFF758FC01460020002924D025 -:108000007168002923D020E0FFF776FC00281CD0FF -:108010007168B068421E0020914216D117E0716865 -:10802000B0686A46106030461C304B1C80210C4AF8 -:108030007A4404E0084A7A4430461C308021FDF737 -:1080400099FA30461C30B82170509C36304603B047 -:10805000F0BDC046241D0020DA1A0000FA1100000D -:10806000EB1A00003D1B000080B5174988420BD079 -:108070001649884213D01649884222D115484168D2 -:1080800000291CD0491E14E012498868002803D03A -:108090004968401E884214D1FFF70AFD11E00D48DF -:1080A00041688268521E914202D1FFF78BFC08E0C2 -:1080B000491C41600078401EFFF738FF01E0FFF7E0 -:1080C00087FC002080BDC0460300008002000080C5 -:1080D00001000080241D002070B50446FFF72CFC31 -:1080E00001280BD0401C0FD11C4E301D00250C2246 -:1080F0002946FCF7F0FCE843706005E01748001DD6 -:1081000000210C22FCF7E7FC204600F0C5F92046D0 -:10811000FFF790FD4068002819D00020C143204699 -:10812000FFF764FE0D4DA860002807D1281D00212F -:108130000C22FCF7D0FCA868002804D0401E696817 -:10814000814200D968602046FFF7F0FE70BD034809 -:10815000001D00210C22FCF7BEFC70BD241D002078 -:1081600070B50546FFF77EFD0446124E30469C3042 -:1081700020222946FCF799FC68780F2806DC0128A4 -:108180000AD0022812D1FFF7B7FB07E010280AD067 -:1081900011280BD1606807E0FFF786FB014600203D -:1081A000002903D070BD2068B82170509C3630463D -:1081B00070BDC046241D002010B5044600F06CF9C7 -:1081C000242060430B490818C42105224254C021D1 -:1081D000094A7A444250BD2101224254CC21074A27 -:1081E0007A444250D021064A7A444250204600F058 -:1081F00029F910BD241D0020561900007DFFFFFF46 -:1082000011FAFFFF70B50546FFF72CFD0446164E28 -:1082100030469C3020222946FCF747FC68780F281E -:1082200007DC012812D0022813D00F2818D12068AB -:1082300009E01038022813D29D20305C0F21014044 -:10824000880020184068B821705009E0FFF72CFB27 -:1082500001E0FFF751FB01460020002900D070BD6E -:108260009C36304670BDC046241D002010B5044623 -:1082700000F012F9242060430B490818C42106229B -:108280004254C021094A7A444250BD21012242543D -:10829000D021074A7A444250CC21064A7A444250BF -:1082A000204600F0CFF810BD241D00204219000028 -:1082B00065F9FFFF65FFFFFF70B50546FFF7D2FCCC -:1082C0000446124E30469C3020222946FCF7EDFB36 -:1082D0006878022804D0012809D1FFF7E5FA01E007 -:1082E000FFF70AFB0146002000290BD070BD9D203E -:1082F000305CF021084205D00F2108408000205852 -:10830000B82170509C36304670BDC046241D0020F8 -:10831000B0B51749884211D01649884215D0164980 -:10832000884222D1F820154C2158E0256059401E82 -:108330008847002819D06059401E11E0E0200F49FD -:108340000858FC22895888470FE0F8200B4C215828 -:10835000E0256059401C8847002806D06059401C21 -:1083600060512078401E00F00BF80020B0BDC046E0 -:10837000030000800200008001000080241D002016 -:10838000F0B581B004460120C6430C4D2F46E437BA -:10839000F8202958E02028583018884701C7761C53 -:1083A000032EF5D12046FFF7FBFC2420604328185C -:1083B000D021034A7A44425001B0F0BD241D002070 -:1083C00059FFFFFFB0B50446F8200B4D2950E020BF -:1083D0002B50FC202A502046FFF72CFCE435A84205 -:1083E00006D00649794400222046FFF7BDFBB0BD08 -:1083F0002046FFF7C5FFB0BD241D0020B4180000C3 -:1084000080B50023FFF7DEFF80BD0000B0B50C4D46 -:108410002878002811D12846BC3000242422214687 -:10842000FCF759FB28780C225043281810302146BD -:10843000FCF751FB2878401C2870C0B2401EB0BD2C -:10844000241D0020B0B5044612480278002A0ED040 -:10845000611C91420BD1242161434518FCF7AEFC0D -:10846000BE2000212952204600F02AF8B0BD01218B -:108470000023002A0A4600D01A46641C00D0194680 -:108480001143012904D14178AA2901D16921417000 -:10849000B0BDC046241D002070B5242460430749A8 -:1084A0000E18FCF78BFC3046BC30002529462246CE -:1084B000FCF711FBBC20355470BDC046241D0020C4 -:1084C000F0B581B004460420FDF7EEFC00283CD056 -:1084D00097283AD0242060431D490C18C02020580A -:1084E0002546C0352646BE3600282ED02046CC3044 -:1084F0000090C4343088AA27217880B2884224D2E0 -:10850000FDF79EFC002820D1FDF71CFCB84203D1EA -:10851000FDF742FCB84218D128683188490140185B -:1085200000990968002902D08847002807D001284F -:1085300003D12868318849014018FBF7A2FB308835 -:10854000401C308029680029D6D101B0F0BDC0465A -:10855000241D0020002243088B4274D303098B4260 -:108560005FD3030A8B4244D3030B8B4228D3030C03 -:108570008B420DD3FF22090212BA030C8B4202D3A5 -:108580001212090265D0030B8B4219D300E0090ACD -:10859000C30B8B4201D3CB03C01A5241830B8B42D6 -:1085A00001D38B03C01A5241430B8B4201D34B03BF -:1085B000C01A5241030B8B4201D30B03C01A524124 -:1085C000C30A8B4201D3CB02C01A5241830A8B42A9 -:1085D00001D38B02C01A5241430A8B4201D34B0292 -:1085E000C01A5241030A8B4201D30B02C01A5241F6 -:1085F000CDD2C3098B4201D3CB01C01A52418309AA -:108600008B4201D38B01C01A524143098B4201D3E3 -:108610004B01C01A524103098B4201D30B01C01A0E -:108620005241C3088B4201D3CB00C01A5241830888 -:108630008B4201D38B00C01A524143088B4201D3B5 -:108640004B00C01A5241411A00D201465241104615 -:108650007047FFE701B5002000F0F0F802BDC0460A -:108660000029F7D076E7704703460B437FD40022FA -:1086700043088B4274D303098B425FD3030A8B42B6 -:1086800044D3030B8B4228D3030C8B420DD3FF2220 -:10869000090212BA030C8B4202D31212090265D0EE -:1086A000030B8B4219D300E0090AC30B8B4201D3A1 -:1086B000CB03C01A5241830B8B4201D38B03C01AE8 -:1086C0005241430B8B4201D34B03C01A5241030B5F -:1086D0008B4201D30B03C01A5241C30A8B4201D310 -:1086E000CB02C01A5241830A8B4201D38B02C01ABB -:1086F0005241430A8B4201D34B02C01A5241030A32 -:108700008B4201D30B02C01A5241CDD2C3098B4216 -:1087100001D3CB01C01A524183098B4201D38B0193 -:10872000C01A524143098B4201D34B01C01A524136 -:1087300003098B4201D30B01C01A5241C3088B427B -:1087400001D3CB00C01A524183088B4201D38B0066 -:10875000C01A524143088B4201D34B00C01A524108 -:10876000411A00D201465241104670475DE0CA0FDF -:1087700000D04942031000D34042534000229C469F -:1087800003098B422DD3030A8B4212D3FC228901A9 -:1087900012BA030A8B420CD3890192118B4208D37F -:1087A000890192118B4204D389013AD0921100E0E1 -:1087B0008909C3098B4201D3CB01C01A52418309F5 -:1087C0008B4201D38B01C01A524143098B4201D322 -:1087D0004B01C01A524103098B4201D30B01C01A4D -:1087E0005241C3088B4201D3CB00C01A52418308C7 -:1087F0008B4201D38B00C01A5241D9D243088B421D -:1088000001D34B00C01A5241411A00D201466346BF -:1088100052415B10104601D34042002B00D5494223 -:10882000704763465B1000D3404201B5002000F062 -:1088300005F802BD0029F8D016E770477047C0461A -:1088400010B5002200F00AF810BDC04610B500F0C7 -:1088500031F810BD10B500F07FF810BD0B0010B559 -:1088600011001A0000F0D4F810BDC04630B5032A3C -:108870000CD903000B439B0719D103680C68A34272 -:1088800015D1043A04300431032AF6D8551E002AC3 -:108890000BD0002303E05A1C9D4206D01300C25C9B -:1088A000CC5CA242F7D0101B00E0002030BD551E6A -:1088B000EFE7C046F0B5C64600B50F2A41D90327F9 -:1088C0000D003E0005430C0003002E402F423DD119 -:1088D0001500103D2D09AC462D01A84680442568A1 -:1088E00067681D605F60A568E7689D60DF601034A1 -:1088F0001F0010334745F2D165460F230C24013584 -:108900002D01491913404519144222D08C59AC51FC -:1089100004369C1B032CF9D80324043B9B08013329 -:108920009B002240ED18C918561E002A06D00023CD -:10893000CC5C1A00EC5401339642F9D180BCB846A5 -:10894000F0BD0500561E002AF1D1F7E70500561EBE -:10895000EDE71A00F6E7C046F0B5C64600B5884216 -:108960000CD98B18984209D2531E002A03D0CA5C36 -:10897000C254013BFBD280BCB846F0BD0F2A0BD8D5 -:108980000500561E002AF6D00023CC5C1A00EC54D9 -:1089900001339642F9D1EEE703270D003E0005436F -:1089A0000C0003002E402F422CD11500103D2D0944 -:1089B000AC462D01A846804425681F001D606568EF -:1089C0005D60A5689D60E5681034DD601033474543 -:1089D000F2D165460F230C2401352D0149191340AE -:1089E0004519144211D08C59AC5104369C1B032CF0 -:1089F000F9D80324043B9B0801339B00ED18C918E8 -:108A00002240BEE70500561EBEE71A00B9E7C04681 -:108A1000F0B5050083074AD0541E002A44D0030055 -:108A20000322CEB202E00135013C3DD301332E706A -:108A30001342F8D1032C2FD9FF220A401502154307 -:108A40002A0415430F2C35D92700103F3F093E015A -:108A5000B4461E001A0010366644156055609560D5 -:108A6000D5601032B242F8D10F260C2201373F01F7 -:108A70002640DB193700224217D03E1FB608B4004B -:108A8000A4461A001C1D644420C2A242FCD1032447 -:108A90000136B6009B193C40002C05D0C9B21C1908 -:108AA000197001339C42FBD1F0BD3400F4E714008F -:108AB0000300BFE72700E0E7F0C041464A465346BF -:108AC0005C466D4676467EC02838F0C80020704768 -:108AD00010307CC890469946A246AB46B54608C8B9 -:108AE0002838F0C8081C00D10120184703000A7874 -:108AF00001311A700133002AF9D1704710B583078C -:108B00000AD00300032102E001330B4205D01A789A -:108B1000002AF9D1181A10BD030019680C4A0D4C2F -:108B20008A188A4322420FD15968094A04338A18A5 -:108B30008A43224208D15968054A04338A188A4375 -:108B40002242F1D000E001331A78002AFBD1E1E79C -:108B5000FFFEFEFE8080808030B5002A28D0030012 -:108B60000B439B0713D1032A11D9134D0BE0043A91 -:108B7000002A1DD0114C1C199C432C4218D10430E2 -:108B80000431032A03D903680C68A342EFD00478A8 -:108B90000D78A5420ED1012A0AD0012306E0C45C5B -:108BA000CD5CAC4206D101339A4201D0002CF6D103 -:108BB000002030BD601BFCE780808080FFFEFEFE51 -:108BC000F0B50C00044303000600A40712D1032AE9 -:108BD00010D9144CA44666460D68134C1F002C197E -:108BE000AC4334421CD10433043A1E0004313D60CE -:108BF000032AF0D80024B71806E00D5D013A355578 -:108C0000BB1A0134002D02D0002AF6D1F0BD00219C -:108C1000D418002AFAD0197001339C42FBD1F5E731 -:108C20001E00E7E780808080FFFEFEFE30B5050075 -:108C300008002B006C18002903D106E001339C4288 -:108C400003D01A78002AF9D1581B30BD2530385886 -:108C5000001976A91488AC17A914873DA914872098 -:108C60009EC9845ACB02FAB24E1C0368B3B517C131 -:108C7000A4488FBA97F0E3459AC053EA0100000078 -:108C800003C01F02B41600142200203F76A91488E6 -:108C9000AC209EC9845ACB02FAB24E1C0368B3B50D -:108CA00017C1A4488FBA97F0E3459AC053EA010070 -:108CB000000003C01F02B423210223210343410407 -:108CC000AC257500313233343536373839414243BB -:108CD00044454647484A4B4C4D4E505152535455CB -:108CE000565758595A6162636465666768696A6B6A -:108CF0006D6E6F707172737475767778797AE0E063 -:108D0000E0E0E0E0E0E0E0E0E0E0E02022242640F7 -:108D10004244484A4EC0C41601010001010101014C -:108D20000101000000000000A117D0C0411CD0C00C -:108D30007103D0C0DD16D0C0CD05D0C02504D0C091 -:108D40000912D0C00914D0C08910D0C0D11BD0C026 -:108D5000E903D0C02503D0C05502D0C06269746356 -:108D60006F696E636173680071707A7279397838EF -:108D7000676632747664773073336A6E35346B6845 -:108D80006365366D7561376C0000000000000000FF -:108D9000FFFFFF00000000000C400BF807FCC0F3D1 -:108DA000F03CF003FE012D00030000000000000075 -:108DB0000E0000000E000000010000008C8DD0C0ED -:108DC000948DD0C000000000FFFFFF00008001E68E -:108DD000C071383807FC001E8007F003CEC1E138AF -:108DE00070061800000000000E0000000E000000D9 -:108DF00001000000C48DD0C0CC8DD0C000000000A8 -:108E0000FFFFFF00000000000C8007F003FEC1FF21 -:108E1000F03FF003CC0033C00C0000000000000065 -:108E20000E0000000E00000001000000FC8DD0C00C -:108E3000048ED0C000000000FFFFFF0041110501BB -:108E4000070000000400000001000000348ED0C0C4 -:108E50003C8ED0C000000000FFFFFF0000000000BB -:108E60001EE01F1C0E03638C19630C0C87837F802C -:108E700007000000000000000E0000000E000000CF -:108E800001000000548ED0C05C8ED0C000000000F5 -:108E9000FFFFFF0048124208040000000700000026 -:108EA000010000008C8ED0C0948ED0C00000000065 -:108EB000FFFFFF00218424010400000007000000E0 -:108EC00001000000AC8ED0C0B48ED0C00000000005 -:108ED000FFFFFF00088A28080700000004000000C8 -:108EE00001000000CC8ED0C0D48ED0C000000000A5 -:108EF000FFFFFF00000000000000C000380067E036 -:108F0000381C9C037E000F80010000000000000060 -:108F10000E0000000E00000001000000EC8ED0C02A -:108F2000F48ED0C000000000FFFFFF000000300002 -:108F30000C80072001CC0033E01C3807FFC3F3F896 -:108F40007CFE1F00000000000E0000000E0000006C -:108F500001000000248FD0C02C8FD0C04175746FE9 -:108F600020417070726F76616C004D616E75616C3E -:108F700020417070726F76616C004261636B0050CB -:108F800075626C6963206B657973206578706F72A8 -:108F900074004170706C69636174696F6E0069730D -:108FA0002072656164790053657474696E6773003B -:108FB00056657273696F6E00312E352E3300517510 -:108FC0006974005369676E006D657373616765004E -:108FD0004D65737361676520686173680043616EF6 -:108FE00063656C007369676E6174757265005265C4 -:108FF00076696577007472616E73616374696F6E10 -:1090000000416D6F756E7400416464726573730026 -:10901000466565730041636365707400616E64202A -:1090200073656E640052656A656374004F505F53E8 -:10903000454E44455200436F6E6669726D00546838 -:10904000652064657269766174696F6E0070617421 -:109050006820697320756E757375616C21004465B5 -:109060007269766174696F6E207061746800526510 -:109070006A65637420696620796F75277265006E72 -:109080006F74207375726500417070726F76652021 -:1090900064657269766174696F6E00417070726F99 -:1090A000766500436F6E6669726D20746F6B656ED6 -:1090B000004578706F7274007075626C6963206B24 -:1090C00065793F00546865206368616E676520704C -:1090D00061746800697320756E757375616C004307 -:1090E00068616E67652070617468005468652073FC -:1090F00069676E2070617468005369676E207061E3 -:10910000746800556E766572696669656420696E7B -:10911000707574730055706461746500204C6564EB -:10912000676572204C697665006F72207468697299 -:10913000642070617274790077616C6C657420735F -:109140006F66747761726500436F6E74696E7565E2 -:10915000004F505F53454E4445525F435245415482 -:1091600045004F505F435245415445004C0E968C8C -:109170000044656C656761746520746F20257320F9 -:109180002866656520256420252529003D666E8BAF -:109190000030313233343536373839414243444573 -:1091A000460043616C6C20636F6E7472616374205F -:1091B0002573006F6D6E69004F4D4E492000555369 -:1091C000445420004D41494420004F4D4E492061F8 -:1091D000737365742025642000252E2A482E2E2EB8 -:1091E000252E2A48006F757470757420232564003D -:1091F0005174756D005154554D00716300000000AD -:109200005C8FD0C06A8FD0C07A8FD0C07F8FD0C023 -:109210007A8FD0C0928FD0C09E8FD0C0257DD0C015 -:109220001492D0C00000000000000000CD3BD0C070 -:109230000000000000000000000000002C92D0C0E0 -:10924000FFFFFFFFB08DD0C0A78FD0C0B981D0C0C5 -:109250004492D0C03C92D0C000000000B08FD0C07B -:10926000B88FD0C0D97CD0C05C92D0C000000000C4 -:1092700000000000E93BD0C000000000000000003A -:10928000000000007492D0C0FFFFFFFF208ED0C00E -:10929000BE8FD0C0B981D0C08C92D0C08492D0C0D3 -:1092A000000000001C92D0C04C92D0C06492D0C08C -:1092B0009492D0C0FDFFFFFFFFFFFFFFF33BD0C044 -:1092C000000000000000000000000000BC92D0C0C0 -:1092D000FFFFFFFF108FD0C0A390D0C0B0200020B0 -:1092E0006D82D0C0D492D0C0CC92D0C0000000001B -:1092F000013CD0C0000000000000000000000000A1 -:10930000F092D0C0FFFFFFFFE88DD0C02590D0C005 -:10931000B981D0C00893D0C00093D0C00000000035 -:10932000E092D0C01093D0C0FFFFFFFF0F3CD0C031 -:109330000000000000000000000000002C93D0C0DE -:10934000FFFFFFFF108FD0C0B190D0C0B890D0C049 -:109350006D82D0C04493D0C03C93D0C000000000C8 -:109360001D3CD0C000000000000000000000000014 -:109370006093D0C0FFFFFFFFE88DD0C02590D0C024 -:10938000B981D0C07893D0C07093D0C000000000E5 -:109390005093D0C08093D0C0FFFFFFFF788ED0C025 -:1093A000C490D0C0D490D0C06D82D0C09C93D0C0A7 -:1093B0000000000000000000DF90D0C00018002076 -:1093C000D980D0C0B893D0C00000000000000000D9 -:1093D0002B3CD0C000000000000000000000000096 -:1093E000D093D0C0FFFFFFFFE88DD0C06E90D0C0FB -:1093F0007F90D0C06D82D0C0E893D0C0E093D0C041 -:1094000000000000393CD0C0000000000000000057 -:10941000000000000494D0C0FFFFFFFF108FD0C0F9 -:109420009B90D0C0B981D0C01C94D0C01494D0C03F -:1094300000000000A893D0C0C093D0C0F493D0C067 -:109440002494D0C0FFFFFFFF788ED0C0EB90D0C037 -:10945000D490D0C06D82D0C04894D0C0000000002D -:1094600000000000F990D0C000180020D980D0C0C2 -:109470006494D0C00000000000000000473CD0C051 -:109480000000000000000000000000007C94D0C03C -:10949000FFFFFFFFE88DD0C06E90D0C07F90D0C09E -:1094A0006D82D0C09494D0C08C94D0C000000000D5 -:1094B000573CD0C000000000000000000000000089 -:1094C000B094D0C0FFFFFFFF108FD0C09B90D0C0E2 -:1094D000B981D0C0C894D0C0C094D0C000000000F2 -:1094E0005494D0C06C94D0C0A094D0C0D094D0C0BC -:1094F000FFFFFFFF488FD0C00391D0C0B981D0C01B -:10950000F494D0C000000000000000001591D0C00D -:109510001C91D0C0257DD0C00C95D0C000000000AB -:10952000000000002991D0C03891D0C0257DD0C066 -:109530002495D0C00000000000000000673CD0C0AF -:109540000000000000000000000000003C95D0C0BA -:10955000FFFFFFFFE88DD0C0DD8FD0C0B981D0C044 -:109560005495D0C04C95D0C000000000753CD0C0D0 -:109570000000000000000000000000006C95D0C05A -:10958000FFFFFFFF108FD0C04891D0C0B981D0C07D -:109590008495D0C07C95D0C000000000FC94D0C061 -:1095A0001495D0C02C95D0C05C95D0C08C95D0C0FF -:1095B000FFFFFFFF4F505F52455455524E000000D1 -:1095C000556E64656C65676174650000000000009D -:1095D000B001000000B0A7000000B00200000030A1 -:1095E0003132333435363738396162636465663019 -:1095F0003132333435363738394142434445466F8A -:1096000000900167006985F1D000000000425443DA -:109610000090009000006A805532465F56329000FC -:10962000010990006E006D00FFFFFFFF00000000C9 -:10963000092111012101222200000000092111014C -:10964000000122220006D0F10901A1010903150041 -:1096500026FF007508954081080904150026FF00C3 -:10966000750895409108C006A0FF0901A1010903F2 -:10967000150026FF0075089540810809041500268D -:10968000FF00750895409108C0050F3900021810B9 -:10969000050038B60834A909A0478BFDA0768815C7 -:1096A000B66500011E001C100500DF60DDD889458D -:1096B000C74C9CD2659D9E648A9F00000306B20041 -:1096C000770000003976D0C04976D0C05976D0C036 -:1096D0006976D0C07976D0C08976D0C09976D0C06E -:1096E000A976D0C012034D0053004600540031004B -:1096F0003000300077002800000000010400010065 -:10970000000000000000020157494E55534200007E -:1097100000000000000000000000000000009200B7 -:1097200000000001050001008800000007000000A3 -:109730002A00440065007600690063006500490066 -:109740006E007400650072006600610063006500D1 -:10975000470055004900440073000000500000001D -:109760007B003100330064003600330034003000E9 -:1097700030002D0032004300390037002D0030004A -:109780003000300034002D00300030003000300058 -:109790002D003400630036003500360034003600FA -:1097A000370036003500370032007D000000000031 -:1097B0000A00000000000306B200080001000000DB -:1097C000A800080002000200A0001400030057498E -:1097D0004E555342000000000000000000008400CD -:1097E000040007002A004400650076006900630059 -:1097F000650049006E00740065007200660061003B -:1098000063006500470055004900440073000000F4 -:1098100050007B0043004500380030003900320022 -:10982000360034002D0034004200320034002D0098 -:1098300034004500380031002D004100380042005E -:1098400032002D0035003700450044003000310063 -:109850004400350038003000450031007D00000034 -:1098600000000000E573D0C01774D0C04D73D0C0A5 -:1098700000000000000000003D75D0C05575D0C04C -:109880000000000000000000000000000578D0C0CB -:109890000578D0C00578D0C01578D0C0C574D0C0C8 -:1098A0001774D0C04D73D0C000000000000000004D -:1098B000F974D0C01175D0C0000000000000000095 -:1098C000000000000578D0C00578D0C00578D0C071 -:1098D0001578D0C0A175D0C0CD75D0C0D175D0C01D -:1098E0000000000000000000D575D0C0ED75D0C0AC -:1098F0000000000000000000000000000578D0C05B -:109900000578D0C00578D0C01578D0C012011002FB -:1099100000000040972C0100010201020301040332 -:1099200009040E034C0065006400670065007200C6 -:109930000E034E0061006E006F00200053000A030A -:10994000300030003000310009026000030102C025 -:109950003209040000020300000209211101000184 -:109960002222000705820340000107050203400090 -:109970000109040100020301010209211101210171 -:109980002222000705810340000107050103400072 -:10999000010904020002FFFFFF02070583034000E4 -:1099A00001070503034000010A0600020000004011 -:1099B0000100000003000000000080002000000003 -:1099C0000100000000000000FFFFFF000000000099 -:1099D00000000000050102000C0004000700000068 -:1099E00000000000FFFFFF0000000000000000007A -:1099F000988ED0C005027A000C0004000700000019 -:109A000000000000FFFFFF00000000000000000059 -:109A1000B88ED0C0071000000C00800020000000AD -:109A200000000000FFFFFF000000000008800000B1 -:109A300000000000071100001A0080002000000054 -:109A400000000000FFFFFF00000000000880000091 -:109A50000000000003000000000080002000000063 -:109A60000100000000000000FFFFFF0000000000F8 -:109A700000000000050100000E00070004000000C7 -:109A800000000000FFFFFF000000000000000000D9 -:109A9000D88ED0C0050278000E0007000400000038 -:109AA00000000000FFFFFF000000000000000000B9 -:109AB000408ED0C00711000003008000200000008D -:109AC00000000000FFFFFF00000000000A8000000F -:109AD00000000000071200001300800020000000BA -:109AE00000000000FFFFFF000000000008800000F1 -:109AF0000000000007130000230080002000000089 -:109B000000000000FFFFFF00000000000A800000CE -:109B1000000000002573202825642F2564290025D6 -:109B2000642F256400252E2A730000000300000026 -:109B30000000800020000000010000000000000084 -:109B4000FFFFFF0000000000000000000501020010 -:109B50000C0004000700000000000000FFFFFF00F1 -:109B60000000000000000000988ED0C005027A00BE -:109B70000C0004000700000000000000FFFFFF00D1 -:109B80000000000000000000B88ED0C005103800B2 -:109B9000020010001000000000000000FFFFFF00A6 -:109BA000000000000A800000000000000711000013 -:109BB0001C0080002000000000000000FFFFFF00EC -:109BC000000000000880000000000000030000000A -:109BD00000008000200000000100000000000000E4 -:109BE000FFFFFF0000000000000000000501020070 -:109BF0000C0004000700000000000000FFFFFF0051 -:109C00000000000000000000988ED0C005027A001D -:109C10000C0004000700000000000000FFFFFF0030 -:109C20000000000000000000B88ED0C0050F10003A -:109C3000080010001000000000000000FFFFFF00FF -:109C400000000000000000000000000007102900D4 -:109C50000C0080002000000000000000FFFFFF005B -:109C600000000000080000000000000007112900AB -:109C70001A0080002000000000000000FFFFFF002D -:109C80000000000008000000000000008183D0C038 -:109C9000081E002000000000000000008C9CD0C0C6 -:109CA000FFFFFFFF000000000000000000000000B8 -:109CB00000000000000000000000000000000000A4 -:109CC0000000000000000000000000000000000094 -:109CD0000000000000000000000000000000000084 -:109CE0000000000000000000000000000000000074 -:109CF0000000000000000000000000000000000064 +:101870001EB10000F0B599B0A94EB778802038436A +:101880006B210D02802800D040E130790B90F47874 +:10189000002F04D1022C02D3802C00D036E1D520B9 +:1018A000C5010C95FE3D04F0F9FAAA2800D02DE1FF +:1018B0000DAD284607F082F9A8859A49084208D05C +:1018C0000DA800218185179804F064FB6F200502A4 +:1018D0000CE10DA804F05EFB1790002F26D04D21DF +:1018E000CA00914C99218D00615B002900D1FAE07A +:1018F000A25A8A4200D0F6E0084600F077FF00289E +:1019000000D1EFE0625B894820187D21890000F05A +:1019100079FF002800D1E5E085482018FFF782FF15 +:10192000002873D000F00EF90546E7E0012C27D817 +:10193000212000017C4D281800275822394603F049 +:101940004CF970790B2800D3CCE07B480068017912 +:101950007A4AA95480797A49685475482818711DC3 +:10196000292203F024F970798000012101437218C3 +:101970005079002C56D0927900021043072252E091 +:1019800099218D00684C615B4D22D700E25B0B9B77 +:10199000D2188A4200D9A6E0084600F027FF0028A6 +:1019A00000D19FE021460024684604604460084658 +:1019B0002830721D0492214605950B9D2B4604F09C +:1019C000ABF9684604604460574894302146049A55 +:1019D0002B4604F0A1F95449C85B08185349401834 +:1019E00004992A4603F0E3F84F4BD85B4019D853CB +:1019F00034700599595A82B2092005034D48914225 +:101A000000D086E002211952747063E04120C000CA +:101A1000215C10220A432254179804F0BBFA0920D3 +:101A2000050373E0062299239C0028538918002897 +:101A300058D0079100F0DAFE002853D04D200894CA +:101A4000C4000A972F532F462835284604F084F9FE +:101A500038469430069004F07FF90994385B089C6E +:101A60000B99491D079A891ACBB21818395B88421D +:101A700038D868460A9F07604760B2180392284624 +:101A800039461D4604F048F96846076047600698E5 +:101A90003946039A2B4604F03FF923480146099C36 +:101AA000085B08182149401803992A4603F07FF87B +:101AB0001D49085B281808530A4637700899515A7F +:101AC00082B2092005031B48914225D10221164B01 +:101AD00019527770154818187D21890000F092FE80 +:101AE00000280BD1179804F055FA0C9D2120000115 +:101AF0000D4908180021582203F06FF804F03EFA4F +:101B00000DA9884202D1179804F044FAA8B219B07E +:101B1000F0BD01211952F1E70121034A1152EDE70D +:101B2000E81F0020FFFF00007C1800208202000058 +:101B30003302000006020000201D002011020000F8 +:101B400012020000F0B5A1B03748384F00243C52D3 +:101B500003AD284607F032F8A8853549084207D07A +:101B600003A884850D9804F015FA6F20040242E062 +:101B700003A804F00FFA0D902021029168464160FD +:101B800019AE0660294F28370125384629463246C6 +:101B9000234604F0C1F8384604F0DEF868460660D3 +:101BA000029B436038462946324604F0B5F8684641 +:101BB000046020481D4908180FAF214622463B46C5 +:101BC00000F0EDFE1D48784403F02AFF80794008BC +:101BD0002840694664220A604860174C3846134F13 +:101BE0003146029A234601F011F86078801C0E49B4 +:101BF00078520920040304F0C1F903A9884202D1F4 +:101C00000D9804F0C7F9212000013818002158224E +:101C100002F0E3FF03A8808D002802D1204621B006 +:101C2000F0BD02F0F9FFC046060200007C1800205B +:101C3000FFFF000033020000E81F0020F6810000D3 +:101C400070B525204001094D285C002801D0084CC2 +:101C500009E04120C600FFF70DFE0446A85DC0065E +:101C600001D502F009FE204670BDC0467C18002058 +:101C700082690000B0B5014669228520002902D0A2 +:101C8000FFF760FF020A0749074B5C5A074D2A55C8 +:101C9000A21C5A52611C89B2685491B2202003F0F0 +:101CA00005FAB0BD060200007C180020E81F0020E5 +:101CB0006D20000270470000F0B589B01E4617463F +:101CC0000A460024E543782A00D987E0002A06D096 +:101CD0000024015D002902D1641C9442F9D30490D0 +:101CE000111B8A2048436421069206F0B5FC034686 +:101CF0005A1C306898423FD9019602950021384617 +:101D00000092059302F069FF059B039406988442B4 +:101D100026D21946039A04980792805C491E0891BE +:101D20001C46395D09020E183D463A2730463946B1 +:101D300006F01CFD4743F11B2F46395539360899EB +:101D40008C4201D8732E04D3611E002C0C46E8DCB3 +:101D500000E02146079A521C06988242059BDAD180 +:101D60000021039A029D019E785C002806D1481C40 +:101D700099420146F8D302E032602FE0084600990C +:101D80008918091A336831608B4227D3131A002B44 +:101D900010DB481E0028059B19DB134878447C188B +:101DA0001E46BB5DC35C635533465B1E491E00295E +:101DB000F5DC0CE08A420AD20A49794414463B5CBD +:101DC000CB5C3B55401C641C33689C42F7D30748EE +:101DD00078440178384602F000FF0025284609B013 +:101DE000F0BDC0460A70000028700000F46F0000CB +:101DF000F0B595B000920F4602900AAC2A21204619 +:101E000006F0A0FD022004430594790001400D2254 +:101E10000A4303924140881D019013250021029836 +:101E20000491405C0690002107200991401A01218D +:101E300008918140069801400791ECB2142C0ED80D +:101E40001520021B60000AA90E183188C81C04293D +:101E500000D808463080521EB61C002AF5D160001A +:101E60000AA9085AFF34072800D82C46E0B21328E4 +:101E700017D814210D1A400005990A180AA90E5AFC +:101E8000138801210027072B084600D83846760022 +:101E90000E2737400743C8431752921C6D1E1E463B +:101EA000EED107980028089A00D102461498400005 +:101EB0000E21014011430AA801850999491C0829EE +:101EC0002546B1D10499491C08292546A7D10021EE +:101ED0000B460A460C46009ED8B240000AAD285A6E +:101EE000240603D1002801D10C4604E0D4B23030DE +:101EF0003055521C01245B1CD8B2039D8542EBD89F +:101F00001106019D02D130213170012200242146A9 +:101F1000CEB2B5420D4622D9361876000AAFBE5B66 +:101F20006D1C002E04D1EEB2019FB742F4D816E02A +:101F30002506009F04D1D4B22E253D55521C012404 +:101F4000DDB26D000AAE755B3035D6B2BD55521CA0 +:101F50005B1C491CCDB2019EAE423546D8D8D0B2EA +:101F600015B0F0BD80B583218900044A5258044958 +:101F70000968496CFFF73CFF80BDC0467C18002013 +:101F8000201D0020F0B583B02B4D00262B4A28469B +:101F9000314602F022FE2846314600F063FE284812 +:101FA0002E52252040012E54264801242C54264828 +:101FB00028180822314602F010FEFF20EC302E5483 +:101FC00022482E542248784403F02AFD4078012804 +:101FD00001D0FFF7E9FB1F48784403F021FD40786A +:101FE000002807D01C48784403F01AFD808800F0D0 +:101FF00040FE02E0FF2000F03DF81848784403F06E +:102000000FFD0078002814D102AD2C7001AE3470A1 +:10201000134F7F44384603F003FD293031462246F2 +:1020200003F05EFE384603F0FBFC2946224603F02F +:1020300057FE03B0F0BDC0467C180020A404000089 +:102040007604000084040000850400008D04000074 +:10205000F67D0000E47D0000D67D0000C07D00001C +:10206000AA7D00004021415C01220A400221114367 +:102070000170704710B582B0014601AC204600F0F7 +:10208000F1FD0548784403F0CBFC001D02222146F7 +:1020900003F026FE02B010BD387D0000F0B58DB013 +:1020A00007464120800032490D180C46284603F0AF +:1020B00053FE00266846066046607720800022189E +:1020C00004232846314603F027FE68460660466032 +:1020D000172000012218202428463146234603F009 +:1020E0001BFE6846066046601920000120490A1858 +:1020F00028463146234603F00FFE0C960B960397B5 +:1021000008377D2084000CAA0BAB3846214600F02E +:102110000DFA002828D00B980C9900266A46166004 +:1021200056600B18083328463146039A03F0F4FD35 +:1021300004AA3846214600F023FB002813D0684645 +:102140000660466004AA1A232846314603F0E4FDDF +:10215000684606604660082328463146039A03F025 +:10216000DBFD012600E0002630460DB0F0BDC04684 +:102170007C180020F0B583B00C4605460026684662 +:1021800006604660412080000A490F181B200001AC +:102190000A1820233846314603F0BEFD6846066023 +:1021A0004660384631462A46234603F0B5FD03B063 +:1021B000F0BDC0467C18002070B504461E4E306845 +:1021C000416B002911D01D4979440322204602F0B9 +:1021D0000DFD012500282CD0194979440322204601 +:1021E00002F004FD002824D030684021405C132810 +:1021F0000CD1144979440422204602F0F7FC00284F +:1022000016D118341049794428220BE00F4979443B +:102210000422204602F0EAFC002809D118340C49B7 +:1022200079440222204602F0E1FC0125002800D07A +:102230000025284670BDC046201D0020BD6B000053 +:10224000AE6B0000976B0000896B0000436B0000D1 +:10225000356B0000B0B50446154800684021405C6D +:10226000132810D1134979440322204602F0BEFC02 +:1022700000281AD11734104979442722204602F049 +:10228000B5FC01250FE00D4979440322204602F0F8 +:10229000ADFC002809D117340949794401252046AD +:1022A0002A4602F0A3FC002800D000252846B0BD35 +:1022B000201D0020F56A0000E66A0000CF6A0000D9 +:1022C000C06A0000B0B504460C480068406B0028A6 +:1022D00010D00B4979440322204602F087FC0125E7 +:1022E000002808D0074979440322204602F07EFCEA +:1022F000002800D000252846B0BDC046201D002083 +:10230000B16A0000A26A0000B0B504461B497944D6 +:10231000032202F06BFC002809D120462330184923 +:10232000794401252A4602F061FC002824D0154991 +:1023300079440322204602F059FC002809D12046A6 +:1023400023301149794401252A4602F04FFC002828 +:1023500012D00E4979440322204602F047FC00289F +:1023600009D143340A497944012520462A4602F01E +:102370003DFC002800D000252846B0BDA96A000019 +:10238000A06A00008A6A00007C6A0000696A000096 +:102390005A6A0000F0B586B0FF2414700468002764 +:1023A0008C421AD20B9E002B01D000241C60002E00 +:1023B00001D00024346005684C1B012C0DDB059214 +:1023C0002A46551C056014784E2C5FD804954C2C79 +:1023D000039704D22746049D45E03C4659E0002778 +:1023E0004E2C26D04D2C0DD04C2CF4D102943746D7 +:1023F000049C0E1B0024012E3E464ADB951C056002 +:1024000057782FE002940196049C0E1B0024022EA4 +:1024100015463EDB009300231C461F46049AD65CFB +:10242000E4B2A640F7195B1C0834022BF7D1ED1C6F +:1024300015E002940196049C0E1B0024042E154600 +:1024400027DB0093002423462746049A165DDBB25F +:102450009E40F719641C0833042CF7D16D1D0560EC +:10246000009B019E029C491B002915DB0495254613 +:10247000B942039C0DD3002B01D004991960002EA2 +:102480002C4600D037600168C919016005980470B6 +:102490000124204606B0F0BD039CFAE7F0B581B0F8 +:1024A00000920722D34308240029224600D01A466E +:1024B000002900D10C4600252946465D7F2737407C +:1024C000002D334600D13B46009F002F00D01E4612 +:1024D000E3B29E4071189C186D1C022DEDD1084688 +:1024E00001B0F0BDF0B581B000920722D3430822BD +:1024F000002900D01A461824002900D10C460025D6 +:102500002946465D7F273740002D334600D13B46A4 +:10251000009F002F00D01E46E3B29E4071189C1809 +:102520006D1C042DEDD1084601B0F0BDF0B5044698 +:1025300000201060186000291FD02578FD26FC2D92 +:1025400001D8012710E0032917D3B54215D1601C2B +:10255000002426462546075DF6B2B7407D19641C67 +:1025600008360327022CF6D115601F601068C319C6 +:10257000012000228B4200D91046F0BDF0B585B095 +:10258000144602460020FD26002B029608D00023A8 +:1025900000291BD01578B54205D201212B4616E043 +:1025A0000B46014613E0032910D3B54219460ED15C +:1025B000561C00252F462B46715DFFB2B940CB1843 +:1025C0006D1C08370321022DF6D100E01946029D4B +:1025D000AD1C04AE357055180395D2185518002B54 +:1025E00017D0002637466846066003A804AA294685 +:1025F0003346FFF7CFFE00280AD004A80178781CE4 +:10260000A14200D038460399A9420746EBD100E029 +:10261000384605B0F0BDF0B585B002920027FD2226 +:10262000002B08D0002300291BD00478944205D247 +:102630000121234616E00B46394613E0032910D347 +:10264000944219460ED1441C00252E462B46615D4E +:10265000F6B2B140CB186D1C08360321022DF6D11D +:1026600000E01946921C04AC227042180392C01874 +:10267000451802980128019716DB002B019F13D003 +:102680000B9C0A9E00276846046003A804AA2946FA +:102690003346FFF77FFE002806D07F1C0298874252 +:1026A00002DA0398A842EED1012002998F4200D0AD +:1026B000019805B0F0BD000070B501464A780123CD +:1026C00000246A2A184600D020460B4D2D6840266B +:1026D000AD5D022D00D023461843022D0AD16A2A8F +:1026E00008D00020002A05D18A78012000216A2A1A +:1026F00000D0084670BDC046201D002080B5C12214 +:1027000000F002F880BD0000F0B581B015460E461D +:102710000746FFF751FD0024002804D13846FFF793 +:1027200099FD002802D0204601B0F0BD0E48006897 +:102730004021405C7978022807D16A2905D0002918 +:1027400007D1B8786A28EED003E06A29EBD00228D6 +:10275000E9D00123384631462A46FFF70FFF00240F +:102760000128E0D10446DEE7201D002080B5C2220A +:10277000FFF7CAFF80BD80B5C422FFF7C5FF80BD4B +:10278000F0B585B0144600270497039703AA6B465B +:102790005A6004AA1A60022201263346FFF73BFF63 +:1027A00001283D4600D1054604990029304600D154 +:1027B000084605400398142800D03E463540002DB9 +:1027C00011D076206070192020701422E2707720DA +:1027D000C64330462130A070201D02F0E8F92436AF +:1027E000667688202076284605B0F0BD0146012097 +:1027F0000023F629024600D01A46B42900D0184614 +:1028000010437047B0B501240023F62A254600D0B6 +:102810001D46B42A00D01C462C438A422BD8002CDB +:1028200029D0F62A03D1B421415C412923D10022C9 +:1028300044231146C45CD2B2944061185B1C083238 +:10284000482BF7D100238A0715D100234C241A46C0 +:10285000055DDBB29D40AA18641C0833502CF7D1EB +:10286000064B012000249942034600D82346002A43 +:1028700000D0204603401846B0BDC0465BAC826025 +:1028800070B50023002A08D00023521E94B2055DC3 +:102890000E5D6E403343002CF7D1D8B270BD01708D +:1028A0000A0A42700A0C8270090EC1707047F0B5B6 +:1028B000A3B0164603AC202522462B4603F058FA57 +:1028C0000BAF384603F03CFA142069460E604860AE +:1028D0000121384622462B4603F01EFA23B0F0BDF4 +:1028E00070B588B014466D4620262A46334603F05C +:1028F0003FFA284631462A46334603F039FA042285 +:102900002046294602F053F908B070BDF0B58BB0EF +:102910001D4614460346109E02270120FF2E00D8B4 +:1029200007461198002808D014203843C2B202A8E4 +:10293000194602F03CF9FFB20EE0FFB202A8C2193C +:102940001846FFF7B4FF300A04D002A84670310AD7 +:10295000017001E002A806701421394302AEF21999 +:1029600014323046FFF7BCFF01951821394301AB03 +:1029700030462246FFF7A0F9002803DB01A80088B3 +:102980000BB0F0BD012002F047F9002A06D0491E25 +:102990008B5C0370521E401C002AF9D17047F0B5C1 +:1029A0008DB0174606780B2E3CD201910293002E73 +:1029B00013D0401C0021182200252B46445DD2B2C2 +:1029C0009440E3186D1C083A042DF7D18A0003AC3B +:1029D000A350491C001DB142EDD102F007FD68462D +:1029E0000760212703AD3846294632462B4603F0BF +:1029F00037FA202238462946029C234603F0DCF9A8 +:102A00000198002805D0129921200123224603F0C5 +:102A1000E3F902F0EBFC03A80021202202F0DDF82C +:102A20000DB0F0BD022002F0F7F80000F0B58DB057 +:102A3000024610780B2843D2012600283DD002968A +:102A40000191521C0024182500273E46D35DEDB2AB +:102A5000AB409E197F1C083D042FF7D1A30003ADA6 +:102A6000EE50641C121D8442EDD10528029E24D133 +:102A70000126F207039B53402C2B03D0542B01D08B +:102A8000312B1AD110490B681C88002C06D0049DEC +:102A90005540A54202D059888D420ED16432059925 +:102AA00091420ADC06990198814206D1074A079BA8 +:102AB00001260021934200D80E4630460DB0F0BDED +:102AC000022002F0A9F8C046201D002050C30000DB +:102AD000F0B58DB002461F4803681C880120002C09 +:102AE00033D01078022801D208462EE001910293DB +:102AF0000B282CD2521C0025182600273B46D15DFE +:102B0000F6B2B140CB187F1C083E042FF7D1A900C4 +:102B100003AE73506D1C121D8542EDD10122D30707 +:102B2000039858402C280299019D04D0542802D0C3 +:102B30003128284609D1049D5D40A542104604D0A5 +:102B40004A88012000219542CED10DB0F0BD02206F +:102B500002F062F8201D0020F0B585B004920C460A +:102B600002780B2A4CD2202121700121002A3DD06D +:102B70000499891E0191461C0023012102920393AE +:102B8000182000221546B35CC0B283405D19521C68 +:102B90000838042AF7D1C9B26018049A511A0122E0 +:102BA000D2072B469343184A7A4402F065FD274624 +:102BB0002046049906F0BCF8C1B2361D019A914234 +:102BC0001BDA002D039B01DB3C4603E027223C4639 +:102BD0006254401CC1B22F226254411CC8B2002270 +:102BE00022545B1CD8B2029A9042C8D3C8B2401E8D +:102BF00000212154C0B205B0F0BD032002F00CF852 +:102C0000022002F009F8C04619620000F0B587B052 +:102C10001C4617460591064602F0E8FB0020069088 +:102C200006AD6846C5600C998160446007600D98E8 +:102C3000002801D00A4900E0084903223046059BDC +:102C400003F0DAF82878C00703D020780121014387 +:102C5000217002F0CBFB07B0F0BDC04601040000BC +:102C6000010600000A020A43FF21090251400180C7 +:102C7000704780B5FF218143000A814201D003F0F3 +:102C800025F880BDF0B5002307241E46155D0F5DB5 +:102C9000F619751905550126FF2D00D81E46671E29 +:102CA000002C3C46F2D101200021FF2D00D808461F +:102CB000F0BDF0B581B0002607240096155D0F5DCC +:102CC000330604D0AF4204D97F1E002303E0009BEB +:102CD00001E0FF373346BFB27E1B06550126AF42E7 +:102CE00000D31E46631E002C1C46E7D1F0B201B093 +:102CF000F0BD000070B582B0044601263002114DCF +:102D0000285C30420DD03F20C0002A580021684680 +:102D10000160416028462830234602F0FDFF300262 +:102D2000285C80070BD53F20C0002A580021684648 +:102D30000160416094352846234602F0EDFF02B061 +:102D400070BDC0467C180020F0B581B07D208600A3 +:102D5000294DA85D002848D03F20C700E8590478D5 +:102D6000FC2C05D801252846FFF7C4FFFF2031E0E1 +:102D7000FE2C19D0FD2C3BD10120FFF7BBFFE859F9 +:102D8000411CE951A95DFF31A955C9B201292CD9CE +:102D900041780091847802252846FFF7ABFF240292 +:102DA00000980443FE2015E00120FFF7A3FFE85937 +:102DB000401CE851A95DFF31A955C9B2032914D9B6 +:102DC00000210A46FFF78EFB044604252846FFF73C +:102DD00091FFFC2008490A46D1594919D151915D0A +:102DE00040189055204601B0F0BD012001F014FFBD +:102DF000022001F011FFC0467C180020F0B5BFB0E2 +:102E00000646E948784402F00BFE857933AC20464B +:102E100005F0D4FEA085ED0801273D4084B2002CCA +:102E200001D000F065FC33A803F0B4F83D90002D0C +:102E3000199700D119951B951DA8C01D189025A89C +:102E4000011D169128301790F1481C961A970746D5 +:102E50006AE2072800D067E23C69002C00D161E2F9 +:102E60007D208500785D002801D100F030FC84428F +:102E700000D30446002CE64F01D100F028FCE0B25C +:102E8000FFF738FF3F20C000395809193950785DE5 +:102E9000001B78553869001B386145E24E7834468E +:102EA000083CE1B2302901D900F01FFCB11C11919E +:102EB000C9B2884201D200F018FCD648784402F02A +:102EC000AFFDD349149D49596A46566025AB059319 +:102ED00013608A1C08302021234602F059FFCC4899 +:102EE00040598019811F08220598FFF7C9FC002866 +:102EF00000D0FAE3C64D149EA8593D21C9006A5C72 +:102F0000002A0DD03A22825C3223C254A859401DB7 +:102F1000A851EA5DF332EA55695C012200293DD1EE +:102F2000811C25AE3046224601F041FE3078322821 +:102F300000D0DAE3B6480546149EAC591698A8515D +:102F40002420FFF7D7FE11996018A851E85D401AB8 +:102F5000E8552F461DA808221799FFF716FD0020F7 +:102F600001460246189E735C7C18257F5219D318BF +:102F700023770122FF2B00D80246491E0C46083455 +:102F8000F1D10125FF2B00D885E0AEE33D20C00044 +:102F90009F49085C0022002800D1A6E31392012675 +:102FA0003046FFF7A7FE9A4D14996858421C6A50A4 +:102FB000E85DFF30E855C0B2232800D895E3F5203E +:102FC0004000285C002826D034022E552420FFF72C +:102FD00091FE00200C942855149C29592431295124 +:102FE000E85DDC30E855C0B2072800D87DE30F204B +:102FF000400128180822039201F0D9FD0398FFF739 +:1030000079FE0C982E54285908302851E85DF83084 +:10301000E855139D3FE0002168460160416017209C +:10302000000128182424234602F076FE2046FFF7EC +:1030300061FE1498295824312950E85DDC30E855A8 +:10304000C0B2072800D850E31DA80822FFF79DFC56 +:10305000002001460246189B5B5C6D4C6418257F7E +:103060005219D3182377FF2B324600D80246491E47 +:103070000C460834EFD1FF2B139D00D935E308200F +:10308000FFF738FE62480146149A88580830885085 +:10309000C85DF830C8553D20C0005D4A105C00286E +:1030A00002D10120010250541C9E159CFFF74CFEDA +:1030B000574F3861022171403D22D200BB5C2B4347 +:1030C0000B430022002B214600D0114600281A9AFB +:1030D00000D104460C4054401B98002802D1002C1B +:1030E00000D102E3022038757D25AC00385D002850 +:1030F00000D1ECE2396901291A9B20D13F20C6009A +:10310000B859007801210022AE2800D11146199A41 +:103110001143012906D101210022AE2800D1114618 +:103120005940F9770120FFF7E5FDB859401CB85127 +:10313000385DFF3038553969491E39611C9E0029B8 +:1031400017D04D1EC0B2854200D30546002D304F2A +:1031500000D1BCE2E8B2FFF7CDFD3F20C0003958F6 +:1031600049193950385D401B38553869401B386162 +:10317000DAE0022E1ED13D21C900795C002915D06C +:10318000F5214900795C002914D0002168460160CE +:1031900041600F2040013A1838462830082302F0D9 +:1031A000BBFDA800385C05E0B86F000001210902F2 +:1031B00003227A54C0B2032800D896E2F5204000DA +:1031C0003D21C900795C00290ED0385C00280BD164 +:1031D0003F20C0003A5800216846016041603846EF +:1031E0002830042302F098FD0420FFF783FD3F20E0 +:1031F000C0003958091D3950385DFC303855012060 +:103200003875B868401EB860F868401CF8608BE0FC +:103210007C180020006F0000F5204200B95C3D25BD +:10322000E800385C00284FD000294DD120266846A0 +:10323000466025A909910160172000013C180B94F4 +:10324000012104910023089320460F92099F3A46DA +:103250000E9502F061FD204602F07EFD6846076093 +:1032600046602046049D29463A46334602F054FD06 +:10327000684646601DAF0760ED4C2834204629465D +:103280003A46089B02F048FD204602F065FD68467C +:1032900007604660204629463A46334602F03CFD28 +:1032A0000B980999324601F082FC19200001E0498F +:1032B00008183946DE4F32461C9E01F078FC0F9804 +:1032C000395C0E98C000385C002822D0002920D03C +:1032D000D848385C00280BD1002168460160416065 +:1032E0001B2000013A1838462830202302F014FD34 +:1032F0000A20387518E0052816D17D208400385D35 +:10330000002800D1E3E13D69002D00D01BE7042037 +:1033100076E709213975002806D03846283002F0B2 +:103320001BFD01E008203875397D00E03975C8B211 +:10333000042807DC02286EDD03282AD00428F3D1F4 +:10334000B86836E0062800DDBBE1D4D17D208400DA +:10335000385D002800D1BAE1032800D8C5E1042077 +:10336000FFF7C8FC3F20C000E74F3958091D39500E +:10337000385DFC3038550821FF221042D6D0012498 +:10338000250200207855FFF7DFFC7C5538610721C6 +:10339000CCE7022E00D13FE77D208000385C00287A +:1033A00000D194E1FFF7D0FC0021B860F96004215E +:1033B000397506210028B9D07D208400385D0028A9 +:1033C00000D184E1072800D88FE1012ECE4F11D122 +:1033D000012040023858F96881420BD13F20C000DB +:1033E000395838461530082201F0E1FB7F20800073 +:1033F000012139540820FFF77DFC3F20C0003958D7 +:1034000008313950385DF8303855FFF79DFC386188 +:103410000520387571E7002806D0012802D002285F +:1034200082D161E6B868E0E00026BE60FE603E61E1 +:10343000384615300822314601F0CFFB3D4628358D +:10344000284602F089FC3C469434204602F084FC75 +:103450003D20C000385C00283AD0012000023E54D4 +:10346000F5204000385C00282DD068460660466094 +:10347000772080003A1804232846314602F04CFC9D +:10348000684606604660172000013A18079220201F +:10349000069028463146069B02F03EFC68460660D0 +:1034A0004660192000013A1828463146069B02F072 +:1034B00033FC684606604660602320463146079A22 +:1034C00002F02AFC04E017200001381802F044FC46 +:1034D0007D2010908600B85D032800D805E13F20CC +:1034E000C5007959772080001290381804240A907A +:1034F000224601F05CFB2046FFF7FCFB7859001DDB +:103500000D957851B85DFC30B8558049795C00293B +:1035100017D0C0B2032800D8E7E07B4F0D9D795942 +:103520004920000138180424224601F040FB2046BF +:10353000FFF7E0FB7859001D7851B85DFC30B855B5 +:103540001FE0734800684021405C16280A9C18D888 +:10355000012181406F48014213D0002120460A46D4 +:10356000FEF7C0FF00280CDA002120460A46FEF7CD +:10357000B9FF6949884204DB109880006249085C01 +:10358000C7E7634800684421415C890718D5007A81 +:10359000022806D0042813D15B481299405C012808 +:1035A0000ED8594CA05D032800D89EE00420FFF7F8 +:1035B000A1FB0D996058001D6050A05DFC30A05526 +:1035C000FFF7C2FB504FB860252149011C9E022E17 +:1035D000524A08D1795C002905D05168002900D1F0 +:1035E0005060002111600121397500281DD07D2017 +:1035F00039468700C85D002869D00124022E1BD0FF +:10360000012E254600D051E523286ED92420FFF74E +:1036100071FB3F20C0003C490A461158243111502B +:10362000D05DDC30D055012540E5032038757BE6C0 +:103630007C1800208E040000012856D93F21CA00C2 +:103640001492314989580A78022A159400D19DE4D0 +:10365000012A00D122E4002A47D13D20C0002A4996 +:10366000085C002841D12E4C7C44204602F0D8F959 +:103670008088FFF7FEFA204602F0D2F98088C0B2B7 +:10368000042806D0022804D001282ED11B98002837 +:103690002BD01D4C149D6059401C6051E05D401EB4 +:1036A000E055C0B2232820D92420FFF723FB60591E +:1036B00024306051E05DDC30E0550120A07700252A +:1036C000E9E401460839032901D3FFF7C2FB02F000 +:1036D00055FC33A9884202D13D9802F05BFC33A827 +:1036E000808D00280DD13FB0F0BD012001F094FA8B +:1036F00033A8002585853D9802F04CFC02480575ED +:10370000204601F089FAC0467C1800208E04000093 +:10371000201D0020800140000300008000180020D0 +:1037200054670000F0B581B000900B0901221340EE +:103730005B42194C1C40CD0815406D42174E2E407F +:103740004701774067404C091440644214482040C8 +:1037500078408E0916407642124F37404740C809DC +:1037600010404042104A02407A4098272F40009D66 +:10377000ED0E49012943C9B2794079251D404D40DC +:10378000F32121406940AE2333404B401E210140CC +:103790005940104601B0F0BDE2996DB7618EBCF2A0 +:1037A000C4B35F3EA8E2AB2E70E4434FF0B581B0E6 +:1037B00015460E4607463C78012000210090FFF791 +:1037C000B1FF002C12D07F1C1F22224042403C78C7 +:1037D0001046FFF7A7FF7F1C002CF5D106E0FFF78E +:1037E000A1FF0246307850406D1E761C002DF6D1A8 +:1037F0000824FFF797FF641EFBD1009A504001B0E8 +:10380000F0BD000070B514460A4601460D487844E4 +:10381000FFF7CCFF23220546D54020239E1A0B46F6 +:10382000B3402B431646203E0D46F540002E00DAED +:103830001D461F232B402370531F641C002A1A4669 +:10384000E9D170BD4E560000F0B599B01D46034653 +:10385000002017901690107014296FD11E99002027 +:10386000002904D0012969D10192082000E00192C9 +:103870000CAF3870781C1422194601F098F9152104 +:103880000026324630463B78000218431346083380 +:103890007F1C491E0224E443A2420EDB0D32134674 +:1038A0000A3B0446DC401F23234002ACA355521FB1 +:1038B000761C092AF3DC521F00E01A460029E2D1E7 +:1038C000002A019F07D00521891A88401F21014045 +:1038D00002A88155761C02A816AA3146FFF792FF6E +:1038E0000020002E394611D002A801780023144A86 +:1038F0007A44202920D2581CAB421DD202ACE45C91 +:10390000145DFC54B0420346F3D3391800220D4B2A +:103910007B4416AC2478202C0ED28418641CAC4254 +:103920000AD816ACA45C1C5D8C54521C082AF0D337 +:1039300000238B54801801E00020387019B0F0BDCE +:10394000785500005855000070B594B014460A46EA +:10395000014601A8FCF771FB01460020002912D0A6 +:1039600001A8027800216B461960011D21250CAECB +:103970002846334602F074FA202228463146234670 +:1039800002F01AFA012014B070BDF0B59DB01446D3 +:1039900013AAFFF7D9FF0025002811D021266F4672 +:1039A00013AA0125304639462B4602F015FA08378E +:1039B0003846FEF757FB20463946324601F0F7F805 +:1039C00028461DB0F0BD0000F0B58BB00746119C35 +:1039D000012F17D0129E032F12D1212205AF0846C6 +:1039E00011463A46FEF763FF00256846056014213C +:1039F000384622463346FFF727FF002836D136E007 +:103A0000022F25D10393049405A8142545700024A2 +:103A10000470861C2122084611463246FEF747FFF5 +:103A2000022F0DD11099002908D0684605600022A8 +:103A30000498334602F0BCF8002817D1002516E0A0 +:103A40006846039912C005A816219623049D09E033 +:103A500025460024684614C00648301883B2212247 +:103A6000084611462A46FEF751FF2C5401252846E8 +:103A70000BB0F0BDFFFF000070B59AB00E460446D3 +:103A80002069002500282AD0217BA068401CFF3136 +:103A9000C9B211AA00252B46FFF777FF00281ED0D8 +:103AA000F388B288A0680078716B33256E46B560E4 +:103AB00004AD22C611A9FFF787FF002500280ED00C +:103AC000246904AD284605F09BF8421C284621468F +:103AD00004F04EFF01250021002800D00D462846A5 +:103AE0001AB070BDF0B585B00A4606460020B07326 +:103AF00034460E34317B082927D803AF00210191C9 +:103B00000825384602922A4601F067F8327BA81A47 +:103B10003818B16801F04BF8029D2735284605F0AA +:103B20006FF8C6B220462946324601F040F8202000 +:103B3000A055A019421C0298416C3846FEF758F96E +:103B40003018201801994170012005B0F0BD000027 +:103B500070B598B004466D466021284604F0F2FE28 +:103B6000A16928461C30402205F0ACF85C20295C95 +:103B70000020002917D1227B082A14D8267D082E80 +:103B800011D86D46A81A1430A16804F0E1FEA81BF4 +:103B90001C302169324604F0DBFE044860222946CD +:103BA00004F0D6FE012018B070BDC04600180020F9 +:103BB00010B50C490860FEF7E5F9252040010A49D7 +:103BC00001240C5401F062F92102084804F0BAFE05 +:103BD000002003F03FFE204603F03CFEFCF7FEFA17 +:103BE00010BDC046201D00207C180020241D002090 +:103BF00080B506480078002801D104F089FC04490A +:103C000079440020024604F031F880BD241D0020D4 +:103C1000A457000080B582B001900648784401F0B6 +:103C2000FFFE293001A9012202F05AF8FFF7E0FF58 +:103C300002B080BDA061000001460020022903D827 +:103C400088000249794408587047C046BC560000B5 +:103C500080B5012805D0002807D10020FFF7DAFF42 +:103C600080BD0120FFF7D6FF80BD002003497944C5 +:103C7000034A7A4404F046FC80BDC04613000000AD +:103C80002700000001460020012903D888000249CE +:103C9000794408587047C0467C56000080B500281B +:103CA00002D0FFF7A5FF80BD0648784401F0B8FEBA +:103CB0002921435C002004497944044A7A4404F0F1 +:103CC00003FC80BD126100007DFFFFFF91FFFFFF3D +:103CD00080B5002003497944034A7A4404F012FC79 +:103CE00080BDC046ABFFFFFFBFFFFFFF80B5FF20D9 +:103CF00002F010F980BD80B50120FCF7FBFDFFF755 +:103D000077FF80BD80B50020FCF7F4FDFFF770FF62 +:103D100080BD80B50120FCF7EDFDFFF769FF80BD98 +:103D200080B50020FCF7E6FDFFF762FF80BD80B59F +:103D30000020FCF7DFFDFFF75BFF80BD80B50120B1 +:103D4000FCF7D8FDFFF754FF80BD80B50020014689 +:103D5000FDF746FCFFF74CFF80BD80B50120002138 +:103D6000FDF73EFCFFF744FF80BD80B50020FCF767 +:103D7000C1FDFFF73DFF80BD80B50120FCF7BAFD16 +:103D8000FFF736FF80BD80B50178490601D001F00C +:103D9000F3F880BDB0B5054607202840002401286F +:103DA00014D0022814D1002909D00B4802F0BEF823 +:103DB00068B200280ADA01F089FF002406E0FF213A +:103DC00052310548002202F0C9F804462046B0BD31 +:103DD000022000F021FFC046E81F0020F0B581B0AE +:103DE000E04D28780C2810DD0D286CD00E2800D16D +:103DF000C7E015280FD1DC48807901280BD1A879BC +:103E0000000708D4102000F007FF052800D111E1B9 +:103E10000C2800D181E2D54C00276760012020707A +:103E2000204602F047F8042002F0C0F860606928DC +:103E300000D05DE101F044F801F044F8BE25F84EF1 +:103E40007753042002F0B2F86060002800D164E2E9 +:103E5000972800D161E2C0243059002800D15CE2EB +:103E6000705BAA27C421715C80B2884200D354E2FF +:103E700002F068F8002800D04FE201F0E5FFB842F8 +:103E800004D102F00BF8B84200D046E23059715B21 +:103E900049014018CC217158002902D088470028D8 +:103EA0000AD0012803D13059715B490140180178CB +:103EB000490601D001F060F8705B401C7053315925 +:103EC0000029CFD129E2D54C00276760012020705E +:103ED000204601F0EFFF042002F068F8606000283F +:103EE00000D11AE2972800D117E2692800D099E1A1 +:103EF00000F0E6FF00F0E6FFBE25C94E7753042030 +:103F000002F054F86060002800D106E2972800D142 +:103F100003E2C0243059002800D1FEE1705BAA27DB +:103F2000C421715C80B2884200D3F6E102F00AF845 +:103F3000002800D0F1E101F087FFB84204D101F080 +:103F4000ADFFB84200D0E8E13059715B490140183B +:103F5000CC217158002902D0884700280AD00128B6 +:103F600003D13059715B490140180178490601D0ED +:103F700001F002F8705B401C705331590029CFD119 +:103F8000CBE1EA4D00276F6001202870284601F040 +:103F900091FF042002F00AF804466C60692C00D0FE +:103FA000E6E000F08DFF00F08DFFBE24E04E3753B9 +:103FB000042001F0FBFF6860002800D1ADE19728E4 +:103FC00000D1AAE1C0257059002800D1A5E1305BDD +:103FD000AA27C421715C80B2884200D39DE101F020 +:103FE000B1FF002800D098E101F02EFFB84204D1C3 +:103FF00001F054FFB84200D08FE17059315B4901A4 +:104000004018CC217158002902D0884700280AD0D6 +:10401000012803D17059315B4901401801784906E4 +:1040200001D000F0A9FF305B401C305371590029CA +:10403000CFD172E1BD4C002767600120207020467F +:1040400001F038FF042001F0B1FF6060002800D1CA +:1040500063E1972800D160E1692800D018E100F001 +:104060002FFF00F02FFFBE25B14E7753042001F043 +:104070009DFF6060002800D14FE1972800D14CE1FE +:10408000C0243059002800D147E1705BAA27C42121 +:10409000715C80B2884200D33FE101F053FF0028F9 +:1040A00000D03AE101F0D0FEB84204D101F0F6FEB2 +:1040B000B84200D031E13059715B49014018CC2140 +:1040C0007158002902D0884700280AD0012803D15E +:1040D0003059715B490140180178490601D000F060 +:1040E0004BFF705B401C705331590029CFD114E154 +:1040F000C0258F4C6059002800D106E1BE26A05B88 +:10410000AA27C421615C80B2884200D3FDE001F09F +:1041100019FF002800D0F8E001F096FEB84204D163 +:1041200001F0BCFEB84200D0EFE06059A15B49014C +:104130004018CC216158002902D0884700280AD0B5 +:10414000012803D16059A15B490140180178490653 +:1041500001D000F011FFA05B401CA0536159002961 +:10416000CFD1D2E0241E00203C210020501F00208F +:10417000D8206F4D2958002911D0642264290B469C +:1041800000D31346CA1A2A50D421002A07D16958ED +:10419000002904D0DC22AA582A5000208847002C8D +:1041A00000D1BAE0972C00D1B7E0C02428590028EC +:1041B0002FD0BE26A85BAA27C421695C80B28842A2 +:1041C00027D201F0BFFE002823D101F03DFEB84206 +:1041D00003D101F063FEB8421BD12859A95B490104 +:1041E0004018CC216958002902D0884700280AD0FD +:1041F000012803D12859A95B4901401801784906D3 +:1042000001D000F0B9FEA85B401CA8532959002931 +:10421000D2D1C420285CBE21695A7AE0501F002008 +:10422000241D0020C025424C605900286DD0BE26B8 +:10423000A05BAA27C421615C80B2884265D201F0EC +:1042400081FE002861D101F0FFFDB84203D101F0E9 +:1042500025FEB84259D16059A15B49014018CC21D3 +:104260006158002902D0884700280AD0012803D1CC +:104270006059A15B490140180178490601D000F05E +:104280007BFEA05B401CA05361590029D2D13CE0C9 +:10429000D020274C2058002803D0E978490800F0A6 +:1042A000AFFEC025605900282FD0BE26A05BAA27EC +:1042B000C421615C80B2884227D201F043FE00280D +:1042C00023D101F0C1FDB84203D101F0E7FDB842AE +:1042D0001BD16059A15B49014018CC2161580029CC +:1042E00002D0884700280AD0012803D16059A15B79 +:1042F000490140180178490601D000F03DFEA05B5D +:10430000401CA05361590029D2D1C420205CBE2199 +:10431000615A814201D301F015FE01F013FE00281D +:1043200001D100F081FC012001B0F0BD501F002040 +:10433000241D0020F0B5A5B01E4614460F460546C4 +:10434000FEF7BAF9002807D0A74979440A22204687 +:1043500004F0FEFA25B0F0BD0494A14800684024A2 +:10436000005D112844D128463946FEF704FA03902F +:104370009B480068005D11283AD128463946FEF76F +:10438000BDF9002812D07B208000039C002C07D0B0 +:104390009449085C002803D0083D2846FDF77EFEBE +:1043A000002C04987ED0924979447DE08C480068C6 +:1043B000005D11281CD128463946FEF7D7F90028A0 +:1043C00016D07B2080000399002907D08549085C1E +:1043D000002803D028460838FDF760FE2C78FD2C15 +:1043E0007F4F64D16878A97809020143C81C5FE057 +:1043F0002846FDF767FF002810D079480068406B19 +:104400000028A7D001F00CFB0146A8786A4610608E +:10441000EB1C0022049801F0CBFB9BE7704F38683F +:10442000C4882846FDF7C8FE0321002802D038685A +:1044300084880421200A04D005AA54701070022731 +:1044400002E005A80470012705A8C0196918142501 +:1044500003902A4600F0ABFBFF20EA306149085C7C +:10446000002810D05E480068C288012000219442D4 +:1044700000D008466946086014210398049A334620 +:10448000FFF7E2F966E7012069460C6048602F43B8 +:10449000B9B2B3B205A8049C2246FEF737FA002150 +:1044A000215457E75149794404F0A2FB52E7601CBC +:1044B0002918153920AE1422304604F049FA307814 +:1044C00000281CD0002020A94E4A7A440B781C09F1 +:1044D000145D05AD2C542C180F251D40535D6370E1 +:1044E000491C801C2928F1D3282005AB0021195430 +:1044F0004121454A7A44049801F0BEF82AE7032096 +:104500000121FD2C00D00846295C4018295C411887 +:10451000039800280CD0685C0818401C295C00290E +:104520000AD04C2909D1291849784018801C04E088 +:1045300068184078891C09E0401C291849784018FF +:10454000801C295C0818401C295C491C08182A5C3E +:10455000411C4C2A00D001466C186078A1780902F1 +:104560000143E078227912020243100408431F90AD +:104570001FA820497944042204F070FB00280DD0C4 +:104580001FA81E497944042204F068FB002800D0CB +:10459000E0E61B4979440B220498D9E63D68287966 +:1045A00019AE307021461131701C15273A4604F0BF +:1045B000CFF9A88801216A4603C205AD50233046D1 +:1045C00039462A46FEF7A2F9002129544420205CEE +:1045D000694608604121084A7A4404982B468BE7D3 +:1045E000201D00207C1800206A530000BC4D0000F4 +:1045F000A94E0000F84C0000994C0000084D000046 +:104600002C510000C74D0000AE4D0000F0B597B032 +:1046100001AD50242846214604F094F94548464F00 +:10462000391815A80822FEF7B0F9444838187B213C +:1046300089002A462346FFF77DFE414E4022304640 +:10464000294604F03FFBA3208000385C142811D1D8 +:104650003C48381840497944042200F0C7FA002841 +:1046600008D1394838183D497944042200F0BEFA8F +:1046700000282FD0354C374626682736304604F0C0 +:10468000BFFA02463D4641352846314600F08FFAD2 +:1046900026682736304604F0B3FA202129543046E4 +:1046A0003E4604F0ADFA2818401C83218900224AB6 +:1046B000505015A8FDF756FC05462068273004F039 +:1046C0009FFA2818401C3018412100224254012032 +:1046D00017B0F0BD1E48381801210022FDF702FF77 +:1046E0000346304641301F2B06D0032B07D0012B49 +:1046F0000BD11B49794404E01A49794401E01A4975 +:104700007944062204F024F904E01421174A7A447B +:1047100000F0B2FF35464135284604F071FAC4B2C4 +:1047200028198321890078500A483818FDF71AFCA7 +:104730002018C8E7820200007C1800208A020000CE +:10474000001800208D02000091020000201D0020B2 +:1047500095020000990200005D4C000063500000CB +:10476000C44B0000C44B0000C44B0000BC4B000015 +:1047700070B58CB020206946486004AE0E600C48CD +:1047800094300C4D2A46413201240023214601F089 +:10479000C3FA6846082306601836436086604121E4 +:1047A000054A7A44284600F067FF20460CB070BDE9 +:1047B0007C18002000180020374B000010B5252081 +:1047C00040010D4C215C0020002900D010BDFFF7F6 +:1047D0001DFF8F20C000205808496158491C0B1A42 +:1047E000074855301421074A7A4400F045FFFCF78A +:1047F0007BFC012010BDC0467C1800207C0400001A +:1048000000180020FD4A0000B0B582B0252040010C +:10481000164D285CA97F01430024002902D02046C0 +:1048200002B0B0BD12482A18294615316846FEF775 +:1048300040FA0028F3D00F48285C01240328EED169 +:1048400000206877F52040003D21C900695C0029FF +:1048500007D0295C002904D101242C54002028759C +:10486000DDE70A2028750124D9E7C0467C1800201E +:10487000850400008404000080B5FFF779FF012063 +:10488000FDF7F8F980BD000010B5044604497A220E +:10489000FEF762F900212046FEF7C8F810BDC046B9 +:1048A0000018002010B5074CC834204604F0A8F9C1 +:1048B000202121542018002141700120FCF71AF812 +:1048C00010BDC046E81F002080B503497944002090 +:1048D000024603F0CBF980BD544B000080B503497C +:1048E00079440020024603F0C1F980BDB04B0000BE +:1048F00080B505497A22FEF72FF904497944002052 +:10490000024603F0B3F980BD00180020384C0000C7 +:1049100080B505497A22FEF71FF904497944002041 +:10492000024603F0A3F980BD00180020C44C00002B +:1049300080B5034979440020024603F097F980BD11 +:10494000684D000010B58CB06C46204604F036F976 +:10495000A0850D49084206D1684601F01BFB0A906C +:10496000FF2001F0D7FA01F009FB6946884202D125 +:104970000A9801F00FFB6846808D002801D10CB029 +:1049800010BD00F049F9C046FFFF0000F0B59FB030 +:104990000446002C2FD10DAC00264822204631467B +:1049A00000F01BF9032525720D9633480E90204622 +:1049B0000930344979440526324603F0C9FF2046C0 +:1049C0001730314F7F443946324603F0C1FF20464D +:1049D00027303946324603F0BBFF26462D362B4999 +:1049E000794430462A4603F0B3FF40201121215478 +:1049F0001A9604201E9021480460214C01200102D7 +:104A0000204603F09FFF01AD284604F0D7F8A885A3 +:104A100085B2002D0BD001A8002181850B9801F0F3 +:104A2000B9FA0B9801F0B6FA102DE7D01FE001ADEE +:104A3000284601F0AFFA0B9000F028FAFDF7A2FA31 +:104A4000002002F007FF012002F004FFFFF7D0F87A +:104A5000FBF7C4FB01F092FAA84202D10B9801F0D7 +:104A600099FA01A8808D0028C8D000F0D5F8FFF78A +:104A700069FF1FB0F0BDC0463A003200201D002083 +:104A8000241D00203C490000314900001A49000063 +:104A9000F0B59FB00446A068002831D10DAD0027C5 +:104AA00048222846394600F098F8032000902872E2 +:104AB0000D9737480E902846093037497944052725 +:104AC0003A4603F045FF28461730344E7E443146BF +:104AD0003A4603F03DFF2846273031463A4603F078 +:104AE00037FF2E462D362E4979443046009A03F082 +:104AF0002FFF4020112129541A9604201E90A560F2 +:104B00000027244E01AD284604F058F8A88530420D +:104B100007D101A801F03EFA0B90F8070FD001F081 +:104B2000D5F901F02BFA01A9884202D10B9801F0C6 +:104B300031FA01A8808D002828D10127E2E70A2058 +:104B400001F0B8F86068022817D004280BD00328B9 +:104B5000E5D1E06800218161A168E068FEF78CFF83 +:104B6000E1688861DBE7E0680021C162A168E06874 +:104B7000FEF7B8FFE168C862D1E7E068FEF7E8FF3A +:104B80000028CCD0A068FFF713F8C8E700F044F87D +:104B90003A003200FFFF00003448000029480000BE +:104BA0001248000080B5002001F0F4F980BDB0B5D6 +:104BB000884208D9002A0FD0491E401E8B5C8354BE +:104BC000521EFBD108E0002A06D000239CB20D5DE6 +:104BD00005555B1C521EF9D1B0BD80B50B46002AAD +:104BE00003D011461A4603F0BBFE80BDB0B50023CA +:104BF000002A0FD0401E491E8C5C855C521EA542C7 +:104C000002D1002AF8D105E00020C0430123A542CB +:104C100000D80346D8B2B0BD10B5044601F0AEF9D5 +:104C2000214603F0D7FF000080B501F08BF9002882 +:104C300000D080BD0648002141706022027002222F +:104C40008270C1700171052101F070F980BDC0460C +:104C5000241E0020B0B51A48C078032807DC0128BC +:104C60000DD0022828D1174802F073F9B0BD0428EE +:104C70001FD0082820D1134802F069F9B0BD114CAB +:104C80000121204602F05EF9204602F03DF90E4C6B +:104C9000A079002811D120460C3000250422294695 +:104CA000FFF79BFF1034082220462946FFF795FFA7 +:104CB000B0BD044802F049F9B0BD1020FFF7ACFFC9 +:104CC000241E0020FC2100203C2100207F210140E7 +:104CD0000020032903D8C8B201490818007B704797 +:104CE0003C21002080B516480179042918D00229FA +:104CF00006D0012922D1811D134802F00DF880BD94 +:104D0000C2787F211140032918D8C9B24A000D4B3F +:104D10009A1800231382821D0B4802F082F880BD8E +:104D2000C2787F211140032908D8C9B2054A521818 +:104D300043791373821D044802F01CF880BDC046FD +:104D4000241E00203C210020FC21002070B51546C7 +:104D50000E460446FF2D1BD80E485021017020211D +:104D600001714571E91C817080222243C270090AD9 +:104D70004170062101F0DAF83046294601F0D6F8F4 +:104D80007F2020404000044908187D21090101824C +:104D900070BDC046241E00203C21002080B50A467C +:104DA000014682201423FFF7D1FF80BD80B50A465B +:104DB000014683201423FFF7C9FF80BD80B50C484E +:104DC0000178002900D080BD062181710A2101707F +:104DD00008498B784A7812021A43FF232A339A42F1 +:104DE00000D31A464280C91C0348FFF7E0FE80BD8D +:104DF0003C210020241E0020E81F0020B0B52048E0 +:104E0000827841780902114300780F280ADC0E28C5 +:104E100010D00F2823D10020012927D1FFF71AFF36 +:104E20000120B0BD10281ED0162818D1FFF7C6FFEC +:104E30000120B0BD13488168643181601621124A97 +:104E4000435A002B08D06424642B1D4600D325460A +:104E50005B1B435213420ED0891E0E29F0D1022053 +:104E6000FEF7BCFFB0BD0020032900D2B0BDFFF7A4 +:104E700039FF0120B0BD002101701020FFF7CCFEEA +:104E8000241E00203C210020FFFF0000B0B50A20B6 +:104E900000F010FF084C0025182220462946FFF795 +:104EA0009CFE65802570A571A56000F061FB03483C +:104EB00005604560B0BDC0463C2100205421002063 +:104EC0007047000002480021016041607047C04601 +:104ED00054210020F0B589B00546084600F0A0FD39 +:104EE0000446002C43D02069002840D0284600F01A +:104EF00097FD014602AD1C2228460192FFF757FE9E +:104F00002168E98062682A81A0681A4F65233B7096 +:104F100089B292B24A434243D1084E1C07231A4237 +:104F200000D10E46314600910426864070181D308F +:104F3000B870000A78700321384600F0F7FF284661 +:104F4000019900F0F3FFA06838700121384600F0A5 +:104F5000EDFFE06800F064FDB1B200F0E7FF0098FB +:104F600085B2206900F05CFD294600F0DFFF09B042 +:104F7000F0BDC046241E002070B500F051FD04466F +:104F800020787F26064000F0DDFF002830D1002E7B +:104F90002ED0E06900281DD000F042FD0546052E08 +:104FA00002D1A07E002824D0284603F029FE064620 +:104FB00012486521017031461C318170090A417027 +:104FC000032100F0B3FF1C21204600F0AFFFB1B277 +:104FD00028460BE0094800214170652101701C251D +:104FE0008570032100F0A2FF2046294600F09EFFB5 +:104FF00070BD20462946FFF76DFF70BD241E0020BE +:1050000070B50446002C28D01448066845688E42C6 +:1050100001D16D1C45600E43002902D00660324666 +:1050200005E00022026042600D4B5B1C1E438A4279 +:1050300001D000214160082D0CD30321284603F044 +:1050400091FB012290073043002900D03046D10760 +:10505000884300E030462946A04770BD5421002017 +:10506000FFFFFF7FF0B581B00F4E01243470B11CFB +:10507000FF2750377A1C204600F03EFF054675702A +:105080007A1B7719F91C022000F036FFB8702D1832 +:105090007619F47000F024FF3071902070710020B8 +:1050A000B071E81D01B0F0BDE81F0020F0B58BB075 +:1050B0000A46064607210E4207D03346D8B291B2BF +:1050C000FEF768FE80B20BB0F0BD4B208400832059 +:1050D0000390AA4DA84F3346019109E06920A949E0 +:1050E00008700398801C487002220199079B2DE1EB +:1050F000102130460840049292B20592002A06968A +:1051000000D1B5E0002800D0B2E0079300910290F2 +:1051100007E0A1B20022384600F020FF012000F095 +:105120003FF900F00FFF0028F3D17D200001A968AE +:105130000E1828780928079A42DC072848D0092841 +:1051400063D100218E48079101F0F8FB10E0FFF7D2 +:105150006BFDA1B20022384600F000FFA868B04203 +:1051600000D3FEE0FFF74AFE00F0ECFE0028F0D18D +:10517000834801F039F90028E9D0059AD01D40088C +:10518000A92800D3F3E003980D307E4B985498186B +:1051900007994170581D0499891C8AB205921946D5 +:1051A000FFF705FD052277480799FFF716FD0598DB +:1051B000401D83B272480399724A01F0D3FB3FE06D +:1051C0000A2804990AD00B2822D17148784401E0BA +:1051D0006E487844059900F035FA31E020462530D4 +:1051E00080B2059E864200D9C1E053203870B97064 +:1051F000080A78700321384600F098FE614831466D +:1052000000F094FE002028701DE0002800D1ABE0E3 +:10521000D0B20599FEF7BEFD002811D0A4E0FFF73B +:1052200003FDA1B20022384600F098FEA868B04203 +:1052300000D396E0FFF7E2FD00F084FE0028F0D1F5 +:1052400028780028EBD10020A87128706880069E7D +:10525000B10600D536E7FFF7E7FC30060298009963 +:1052600006D5089108AA484B1846114601DF029856 +:10527000002804D170066ED40020A8712870002088 +:10528000688000F05FFE002801D1FFF7CDFCA1B2DD +:1052900000223846079200F061FE022806D8B9784D +:1052A0007A7812020A43D11C81423DD1FFF7A6FD54 +:1052B000688829780029E4D00028E2D0354979446B +:1052C0000422304E3046FFF791FC00282ED03249A0 +:1052D000794404223046FFF789FC00282BD02F495F +:1052E000794404223046FFF781FC002837D1039827 +:1052F0002730C6B200F0D2FDB04200D0EEE6012069 +:10530000204E3070B01C402100F0BAFD7070811C3E +:10531000184A121D1140039B0D337354C11C1140D8 +:1053200000237354021D10E00020A7E7FFF79AFE48 +:105330000246002309E00020707003980D303070A1 +:1053400080200699014302220B460199DEB20B42EE +:1053500000D1CDE6B2E6688806494018B2E6688812 +:10536000B0E61020FFF758FC0920FFF755FC02209B +:10537000FFF752FCFBFF0000241E00203C21002010 +:105380005C210020E81F0020BE9A0060C7FBFFFFE1 +:10539000DDFBFFFF1244000005440000FA4300005B +:1053A00070B5044600F0CEFD002801D1FFF73CFCAB +:1053B0004B2081000B4E002530462A4600F0CEFDE2 +:1053C0003078152806D8012181400748014201D0D4 +:1053D000002C05D1FFF712FD0125002800D105465C +:1053E000284670BD241E00202070200010B5FFF755 +:1053F0001BFC084C4B2081000022204600F0AEFD33 +:1054000020780E2801D0FFF7F9FC00F09BFD002862 +:10541000F0D110BD241E0020F0B581B000920F46DF +:1054200004464B4EB74210D0494D00214026284635 +:105430003246FFF7D2FB00984028024600D332469E +:1054400028463946FFF7B3FB414EB07801280ADC05 +:10545000002828D0012869D1F01C042100F04EFC5E +:10546000402130462BE0022827D005285ED1307934 +:10547000F17809020143374C2068002781425BD153 +:10548000206800281ED03448009D2918334A13682C +:105490006D1FADB2AB4200D21168051D0D40304802 +:1054A0000068711D34E0F01C002704223946FFF724 +:1054B00094FB40213046A0473EE025484021A047CC +:1054C000002739E0B079717909020143254801606C +:1054D00001684908A8292FD801682048016071781F +:1054E000327812020A4320490A601D491F4A0A60A5 +:1054F000009D691F8AB218495218D21C0368ED1F1B +:10550000ADB2AB4200D202680D1D1540F11D174827 +:105510002A46FFF74CFB11480168491B01601048FF +:105520000168491901602068401C20600B4801682F +:1055300001200227002907D1064800210160084800 +:105540000160064801603846C0B201B0F0BDC046F7 +:10555000A0210020E0210020FBFF0000E821002026 +:10556000EC210020E4210020F0210020E81F002091 +:10557000034800210160034801600348016070474F +:10558000E0210020EC210020E8210020F0B581B0CE +:10559000264F3A68264C2168002921D0002A1FD0C6 +:1055A0000090264D002140222846FFF716FB0520DB +:1055B000A87023480168090A2970006868701D49AD +:1055C0000868000AE87008682871096820680029DE +:1055D0000ED03B263B2800D826683968681D12E0AB +:1055E00014480021016039601348017021601BE0FC +:1055F0003926392800D826682068000A6871206892 +:10560000A8713968E81D3246FFF7D1FA009A0949B6 +:105610002068801B20603868801938600868401C4A +:10562000086006484021904701B0F0BDEC21002001 +:10563000E8210020E02100203C210020A0210020C2 +:10564000F021002080B500290BD0064A002313600A +:10565000054A1160054A064B1360064A1160FFF7C0 +:1056600095FF80BDE0210020E8210020EC210020F2 +:10567000E81F0020E421002081B0F0B58EB015466F +:105680000C4606901393022C00D2BAE1069800282B +:1056900000D1B6E1002D00D1B3E10698214603F018 +:1056A00051F913A809902978002900D1A9E1671EB2 +:1056B000002602E0A8194178761CC8B2002801D063 +:1056C0002528F7D1BE4200D33E46069C20462946F7 +:1056D000324603F041F9BF1BA4190694002F00D1F4 +:1056E0008FE1A95DAD19252900D087E16B1C002051 +:1056F00020210A220892049005900790044608464B +:1057000004E009990A1D0992096804911D46224680 +:1057100029786D1C00242D29F9D0472918DC2F2960 +:1057200026DD0B46303B0A2B00D366E130290446C8 +:1057300000D10C46079B002B00D004460A23079893 +:1057400043435818303807902B4620461446DDE76F +:10575000672904DD722921DD73293AD122E062290B +:105760003CDC48294BD1014601200590084617E052 +:10577000252958D02A2926D02E2900D03DE1297884 +:105780002A2900D03AE16A786B1C01242A21482A90 +:10579000B7D0682AB5D0732AB3D02FE1682936D1A3 +:1057A0001021089109990B1D0993032313400968DF +:1057B000012B00D1BBE0022B00D1BAE0032B2B461A +:1057C0001446A3D0C6E02978022473292B4698D02A +:1057D00014E1752929D078291CD00EE1632900D164 +:1057E0009BE0642900D008E1029003970998011D0D +:1057F00009910068C11742184A40C00F1CE058299F +:1058000000D0FAE0014601200590084602E0702928 +:1058100000D0F2E0029003970998011D09910268F7 +:105820000020102709E025207BE0029003970998CB +:10583000011D0991026800200A270124974208925D +:10584000049012D8012638460446394602F004FF77 +:10585000B04209D1384660430799491E079108991B +:1058600088422646F0D900E034460798411E049B42 +:10587000002B00D107990026F243002B029800D19B +:105880001A460192C2B2302A06D1002B04D00AA8CF +:105890002D23037000230126881E0D280BD80AA88B +:1058A0003043491E049303F05BF8049B079880196A +:1058B00001994018461E002B03D00AA82D218155BE +:1058C000761C0598002C1AD0002802D05348784442 +:1058D00001E05148784407900898214602F0BCFE48 +:1058E000394602F03FFF0798405C0AA988552046D8 +:1058F000394602F0B1FE761CA7420446ECD9039F5C +:10590000BE4200D33E460AA9069C2046324603F01A +:1059100023F8BF1BA41906946DE00998011D099195 +:105920000068069908707F1E491C069163E0049E7A +:1059300016E00878002860D10499B94200D33946AE +:105940002022069C2046049103F00AF804983F1A8E +:1059500024183DE000228B5C521C002BFBD1561E0C +:10596000089810282AD1002E47D000243B46085D15 +:105970000F2202400009022B1F4642D3059B002B39 +:1059800005D0012B0ED10794224B7B4402E00794F3 +:105990001F4B7B44D2B29A5C069C6270C0B2185C0A +:1059A0002070079C3846871E02282AD0641C06985F +:1059B000801C0690B4423B46D9D30DE0BE4200D3D2 +:1059C0003E46069C2046324602F0C6FFBF1BA41985 +:1059D0000694002F079C14D0B4420ED9A41BBC42DD +:1059E00000D33C462022069E3046214602F0B8FFF6 +:1059F0003F1B36190696002F03D02978002900D0C6 +:105A000056E600200EB0F0BC02BC01B00847C0460C +:105A10004D3D0000653D00000B3E0000213E0000B2 +:105A200080B50449884204D30349884201D200F07A +:105A300005F880BD0000D0C0009ED0C07A46024963 +:105A4000C91C891A401A70473D5AD0C010B541018F +:105A5000104A0A40430E01210B405B420E4C1C4091 +:105A60005440820E0A4052420C4B13406340C20E17 +:105A70000A4052420A4C14405C40020F0A40524213 +:105A8000084B13406340400F08404142064808401D +:105A9000584010BDE0FFFF3FB2576A3B6D8E502665 +:105AA000FA19A11EDD33423DB362142AF0B587B066 +:105AB00005930492064602910D7800270120002DDF +:105AC00003971BD00298401C0690012000272C460B +:105AD000019721464139E2B2202A5FD3C9B21A297F +:105AE0005CD3FFF7B3FF01460698C25DE020044097 +:105AF000600948407F1C002A1446EAD10599C9195B +:105B0000C91D5A2903994CD8FFF7A0FF002D0ED0CC +:105B100002994C1CFFF79AFF014635701F20284060 +:105B20004840611C761C2578002D0C46F2D13121AD +:105B30003170711C06910599002914D000241A4E69 +:105B40007E44039404990F5D1F2F29D8F55DFFF75C +:105B50007DFF06990D557840641C05998C42F1D360 +:105B60000699091906910624FFF770FF641EFBD100 +:105B70000121484019220D497944069B0446D4402E +:105B80001F2525404C5D1C70541F5B1C002A2246BB +:105B9000F4D1002006998871012102E0019900E00A +:105BA0000399084607B0F0BD28330000F03200002A +:105BB000F0B595B00C46054600200390102A1EDC77 +:105BC0001A99002A03D08E1E262E04D917E0142914 +:105BD00001D0202913D104AE327001206A46082773 +:105BE00082C21060701C03A9052200F00AF8039815 +:105BF000431C0393284621463246FFF757FF15B052 +:105C0000F0BDF0B587B0049301910546104601231D +:105C100083405C1E00270E9900910D9902910C9A09 +:105C2000002A3E4627D04142059100263746029978 +:105C300076188F4004990B781F43491C0491521E1B +:105C400003928642069712DB01990B6802462046B2 +:105C50005C1C0C60059CA4192F46069DE54004467B +:105C600010462540FD543D46361A8642EDDA039A29 +:105C7000002A069FDBD1009900290CD0002E13D0FA +:105C800001990B68024620465C1C0C60911B8F40FA +:105C90000740EF5408E0811B8F4027400021029805 +:105CA000864202DA002F00D10121084607B0F0BD7C +:105CB00001DF704780B584B00190034801A9FFF768 +:105CC000F7FF04B080BDC0463701006080B582B0E8 +:105CD00002486946FFF7ECFF02B080BD3C0200605D +:105CE00080B586B0019002910392034801A9FFF7A5 +:105CF000DFFF06B080BDC0467F03006080B584B082 +:105D00000090019103486946FFF7D2FF019804B063 +:105D100080BDC0462C05006080B588B00090019120 +:105D2000029203930A9804900B98059003486946E1 +:105D3000FFF7BEFF019808B080BDC0463B0700607A +:105D400080B584B00190034801A9FFF7B1FF029824 +:105D500004B080BD7F08006080B584B00190034826 +:105D600001A9FFF7A5FF029804B080BDDB0A00601F +:105D700080B586B000900191029203930348694672 +:105D8000FFF796FF019806B080BDC0462C0B00605F +:105D900080B588B000900191029203930A98049014 +:105DA0000B98059003486946FFF782FF019808B0F9 +:105DB00080BDC0462B1A006080B586B0009001916E +:105DC0000292039303486946FFF772FF019806B0F9 +:105DD00080BDC046EA2E006080B586B0009001917B +:105DE0000292039303486946FFF762FF019806B0E9 +:105DF00080BDC0462E2F006080B58AB00090019112 +:105E0000029203930C9804900D9805900E980690BA +:105E10000F98079003486946FFF74AFF01980AB0B8 +:105E200080BDC046F338006080B586B00190029115 +:105E30000392044801A9FFF73BFF029880B206B025 +:105E400080BDC0466E92006080B582B0034869464E +:105E5000FFF72EFF0198C0B202B080BD4F9F0060D7 +:105E600080B588B001900291039204930A9805903E +:105E7000024801A9FFF71CFF08B080BDBA530060BB +:105E800080B584B00090019103486946FFF710FF88 +:105E9000019804B080BDC046FCA8006080B582B007 +:105EA00003486946FFF704FF0198C0B202B080BD05 +:105EB0003CA0006080B584B00190034801A9FFF7C1 +:105EC000F7FE029804B080BD5864006080B582B0CF +:105ED00002486946FFF7ECFE02B080BD8D680060A5 +:105EE00080B582B003486946FFF7E2FE019802B030 +:105EF00080BDC0466E6A006080B586B00190029198 +:105F00000392034801A9FFF7D3FE029806B080BDB3 +:105F1000D474006080B584B00190034801A9FFF7F4 +:105F2000C7FE04B080BDC046BE9A006080B584B094 +:105F30000090019102486946FFF7BAFE04B080BDA7 +:105F40008183006080B582B003486946FFF7B0FEE8 +:105F5000019802B080BDC046BB84006080B586B0A9 +:105F6000019002910392044801A9FFF7A1FE029853 +:105F700080B206B080BDC046E485006080B582B0C6 +:105F800003486946FFF794FE019802B080BDC04601 +:105F9000B187006080B584B00190034801A9FFF784 +:105FA00087FE029804B080BD7588006080B584B01B +:105FB0000190044801A9FFF77BFE0298C0B204B02B +:105FC00080BDC0468B9C0060F0B585B03A4A12781F +:105FD000002A03D083213A4A7A440BE00A9A452AE0 +:105FE00003D88321374A7A4404E0072907D1832163 +:105FF000354A7A44022300F0B5FC05B0F0BD0192A9 +:10600000029040200393185C0490002822D004984A +:106010000528039D08D1284641302C4979440522A2 +:10602000FEF7E4FD002833D041350027284E7E449A +:10603000049C0321384602F00FFB0221C94341436F +:10604000705C297841402970641E761C6D1C7F1C91 +:10605000002CEED145200399085C4630019A90420D +:1060600010D141311548049C2246FEF7A0FD0720BF +:10607000114988714C80092008700121029800F0B4 +:106080005DFCBAE78321134A7A4402230298B2E7FF +:106090000A4D03222A70681C0F497944FEF787FDD8 +:1060A000281D0E4979440422FEF781FD2878431DFE +:1060B000832102982A469EE73C210020E81F002009 +:1060C000293700001D37000013370000EB360000B1 +:1060D000DF3600008E360000733600006D3600009B +:1060E000F0B581B01D460E460446284600F016FC69 +:1060F00000280ED02068C11C090A6A469170811CD4 +:10610000090C5170411C090E1170001D2060D070E7 +:1061100004E0684604222946FEF749FD174F08228D +:1061200038463146FEF743FD3846083069460422BA +:10613000FEF73DFD00207873022139730121B97308 +:10614000F8733874284600F0E9FB0146201D8625C7 +:10615000002906D029467931C9B20422FEF73DFD57 +:1061600003E069460422FEF722FD044A112320467B +:10617000294600F0F7FB01B0F0BDC046E81F002043 +:10618000F0B583B0029088794B791F020743887875 +:1061900001904B780E781546093DACB2A74204D069 +:1061A000D01FD21F92B297421BD13D46002E08D07D +:1061B00083211C4A7A440223029800F0D3FB03B0E7 +:1061C000F0BD022B18DC012B23D0022B1DD1A8B26D +:1061D0006A461060CB1D002202980199FFF7F4FE79 +:1061E000EDE7E4B2A742E1D0D2B297420546DDD056 +:1061F00083210D4A7A44DEE7032B0ED0C12B04D154 +:1062000083210A4A7A440423D6E783210A4A7A443E +:10621000D1E78321064A7A44CDE78321054A7A44AF +:106220000823C9E7703500000F3500001C35000059 +:10623000E9340000FA3400001835000080B5C16967 +:106240008A784B781B0213430A78812A09D0832A63 +:106250000CD0862A0ED1C91C031D0022FFF740FF77 +:1062600080BDCA1C812100F07DFB80BDC91C1A467F +:10627000FFF786FF80BD000070B50D460146012A7C +:1062800011D1094C20462A46FEF791FC60194026A0 +:10629000721B00252946FEF7A0FC812021463246CC +:1062A0002B46FEF753FD70BDA02100200282C16085 +:1062B0000022C282827642858284C1610262704776 +:1062C000F0B583B00D4604462A20215C20462A30D2 +:1062D00001294AD000293BD12B21002262542346B8 +:1062E0002B332027E15DC91EC9B22646203601297D +:1062F0003ED8218BE28A91423CD94020012D00D02A +:1063000038460290A07E03230126002800D03346A1 +:106310000027012D3E4600D12E46B60033431E46CF +:10632000029B9B1B891A1A46914200DC0A4691196E +:106330000291012D08D1211D2A48042701923A46D5 +:10634000FEF735FC019AA07E002820D0FF302BE01C +:106350002521615C062908D12B21625C002363544E +:1063600023462B33002A03D1BBE72B2000212154E5 +:1063700003B0F0BDFCD10021A176E182197001705B +:10638000B1803160E068E06115480170F0E74020BD +:10639000205CB9B2134B58540120384381B2637E5C +:1063A000104F7B54471C207EB9B20E4B5854E16904 +:1063B000002907D01746BAB29819E38AC918FEF720 +:1063C000F6FB3A46E08A1018E082A07E401CA076D8 +:1063D000029881B203482A46FFF74EFFC8E7C0463D +:1063E0003C210020A021002001462A200A5C012037 +:1063F000002A10D0012A01D100200CE025200A5CDF +:106400000020062A07D12B200A5C01200021002A47 +:1064100001D0084670477047B0B52B210124445481 +:10642000011D0B4D04222846FEF7C1FB00206871B8 +:10643000832028710220A8716920E8717C20C04364 +:10644000801C2872092128462246FFF715FFB0BD9F +:10645000A0210020B0B52B2101244454011D084D7A +:1064600004222846FEF7A3FB0020687188212971C9 +:10647000A871072128462246FFF7FEFEB0BDC046A0 +:10648000A0210020F0B581B004462520205C2646DE +:106490002536002505286AD008784B781B0203436F +:1064A0008878CD782D02054328041843237965792F +:1064B0002D021D43A379E7793F021F433B042B4381 +:1064C000834257D108790B1D658C002D13D02423EE +:1064D000E75C23462433B8424CD1278B401C18700C +:1064E0007B1B501F984200DB18464219628482B21F +:1064F000208D491D23E07C25ED436D1DEFB28325E2 +:10650000B84204D12046FFF7A5FF01252FE08F797F +:10651000497909023943C91CA8422BD1208B8DB27D +:10652000A84227D189B2164D24270020E055121F1A +:106530008A4200DB0A466284154019462A46FFF764 +:1065400073FC2085218B628C01258A420FD3E18C5C +:1065500088420FD106203070002060842A20205C01 +:10656000012804D12046FFF757FF0020307028464D +:1065700001B0F0BD052030701020FEF74DFBC04685 +:10658000FFFF0000F0B589B0044623722020205C94 +:106590002646203603280AD02A25675D25462A3557 +:1065A000002F1BD02046FFF76DFF002814D1D748DD +:1065B00006210172042131707A21C9433A31402207 +:1065C000A1540830E0610020A076E0820120208301 +:1065D000217A2046FFF774FE09B0F0BD042809D1E6 +:1065E0002B2000272754A776E7822F70B7803760CB +:1065F000E068E06108910020012B00D11846870077 +:10660000012039460143079191423BD80390012B69 +:1066100006930492059707D1201D04220899FEF7DE +:10662000C6FA059F049A069BE08A00280CD0012B2D +:1066300024D120461230211D0422FEF7D7FA059FEF +:10664000049A069B002819D003213846084390423B +:1066500018D800910899C8190290C8570F467A2196 +:10666000C9437A3149B28525884225DDA7480421EE +:10667000017231703A3540216554A2E70220384357 +:10668000904202D9A148852193E72120205C9842BD +:1066900046D13078012851D1012B7FD1211D042210 +:1066A00008980392FEF7A2FA059F002876D0974833 +:1066B0000621017203997EE70195012B14D13078F0 +:1066C00001281ED1251D2146123104222846FEF73D +:1066D0008DFA069B002807D0029800780199491C82 +:1066E000C9B2884200D0E8E03078012809D1012BF6 +:1066F00000D080E0029800780199491CC9B2884214 +:1067000079D1079978184078795C0F020743208A7D +:10671000C01E87421FDD7D480099017204216DE093 +:106720007A20C04301460831784A11720421317041 +:106730003A30402160540832E26144E7012B56D1DF +:106740002B2000212154A176E1822970B180316093 +:10675000E068E06140E702980078812805D086284B +:10676000019D51D0832800D097E0012B57D1251DE2 +:1067700067497944042228460892FEF737FA002830 +:1067800007D06449794404222846FEF72FFA0028EE +:1067900045D15E480B21017208992FE0089AD11962 +:1067A000D05DA27E904222D10498079A851AE08A91 +:1067B000228B121A954200DB1546AFB2E26910181F +:1067C000491C3A46FEF7F3F90699012908D1E08AF7 +:1067D000E1690918E08C3A46FFF726FB0699E08448 +:1067E000E08A2818E082A07E401CA0763CE0474862 +:1067F00004210172DFE64548042101723170019ADB +:106800003A3240216254DCE6012B6AD1201D424914 +:10681000794404252A46FEF7E9F9002870D0049847 +:106820000599451AFF1CBD4200DB3D46AAB2E0694E +:1068300002990892FEF7BBF9069B012B06D1E1698C +:106840000020089AFFF7F0FA069BE08421202354E9 +:106850002783E5820020A07620461230211D0422E5 +:106860001D46FEF7A4F92946E08A012901D1218BB2 +:1068700006E0218BCA1C824202D22448032198E6FA +:10688000884204D20020606301203070A4E6022018 +:1068900030702046FFF7D2FC9EE61C48039B037233 +:1068A00004213170019A3A32402162540830E0618B +:1068B0000020A076E08223838AE6144C042220463E +:1068C0002946FEF774F90020607101983A30207172 +:1068D000039AA2710620E07108212046FFF7CCFC44 +:1068E0007AE60A48039A0272042131703A3540214F +:1068F00065540830E0610020A076E082228367E6DC +:1069000002480B210172357079E7C046A0210020B2 +:10691000B62F0000A82F00001C2F000080B50649EC +:1069200079440422FEF762F9014601200022002981 +:1069300000D0104680BDC046082E000080B52A2237 +:10694000835C02462A32002906D0002B08D101219F +:106950001170FFF761FD80BD012B01D10220107085 +:1069600080BD000070B504462A20205C002809D0B4 +:10697000012824D02520205C062820D12B20205C53 +:1069800000281CD12020032525544020215400201C +:10699000A076E261E08223832120215C2546213517 +:1069A00003290DD1084E3078002808D0032100E0DB +:1069B00029782046FFF784FC30780028F8D170BD94 +:1069C0002046FFF77DFC70BD3C21002002490020DD +:1069D0000860024908607047F8210020F421002077 +:1069E00010B50748002444704F21017001218170C7 +:1069F0000221C1700421FFF799FA204610BDC0465C +:106A0000241E002070B582B06D4600246C704F26A5 +:106A10002E700220A8700320E8702C7105212846F2 +:106A2000FFF784FA6C702E700120A870E8700421C2 +:106A30002846FFF77BFA204602B070BD10B582B041 +:106A400001A8002444704F210170012181700221AE +:106A5000C1700421FFF76AFA204602B010BD0000A1 +:106A6000B0B582B0144800240460144804606D4638 +:106A70004F2028706C700520A8700420E870012059 +:106A800028716971AC71012A05DC002A0AD0012A3B +:106A90000AD1042006E0022A03D0032A04D10220EE +:106AA00000E00320694688716846C3710821FFF73A +:106AB0003DFA002002B0B0BDF8210020F4210020F2 +:106AC00010B582B06846002444704F22027005223F +:106AD00082700422C2700122027141718471C471FA +:106AE0000821FFF723FA204602B010BDB0B582B0EE +:106AF0000D466846002444705021017003218170C6 +:106B0000C5704021017144710621FFF70FFA802002 +:106B1000054201D0074800E0054801687F22154082 +:106B20000122AA400A430260204602B0B0BDC0461E +:106B3000F8210020F421002070B582B00D4668468F +:106B4000002444705021017003218170C57080269B +:106B5000067144710621FFF7E9F9354201D0074873 +:106B600000E0054801687F2215400122AA409143B8 +:106B70000160204602B070BDF8210020F421002001 +:106B80008020014201D0064800E0044802787F20BE +:106B900001400120884010407047C046F821002085 +:106BA000F421002010B582B06846002444704F22C2 +:106BB0000270022282700322C27001710521FFF768 +:106BC000B5F9204602B010BDB0B582B01C461546DE +:106BD000684650220270C170202101714471E11C8D +:106BE0008170090A41700621FFF7A0F92846214665 +:106BF000FFF79CF9002002B0B0BD10B582B0684626 +:106C0000002444705023037003238370C17030212B +:106C1000017142710621FFF789F9204602B010BDCB +:106C200070B515460E4604460220002C0FD0D42124 +:106C3000204601F087FE002E01D0B02026509C2077 +:106C40000121215425702046FFF7C0FE0020C0B26C +:106C500070BDB0B504469C2001212154B425605973 +:106C6000002806D04068FEF7DBFE02462179204668 +:106C700090470835CC2DF2D12046FFF7DFFE2046A5 +:106C8000FFF7AEFE0020B0BD0223002A07D000238C +:106C9000022804D8C0000818B42142500023D8B2FA +:106CA000704780B5FFF7AEFE002080BDF0B581B023 +:106CB0000C4605460026B4272846314600F066F902 +:106CC000002807D0E8590068FEF7AAFE02462846C9 +:106CD000214690470837761C032EEDD1002001B0E5 +:106CE000F0BDF0B581B00C4605460026B427284615 +:106CF000314600F04BF9002807D0E8594068FEF70C +:106D00008FFE02462846214690470837761C032E00 +:106D1000EDD1002001B0F0BDB0B504462546A83540 +:106D2000284600F077FB942001212150AE20205A04 +:106D300098216050A820215C1F200840022808D01C +:106D400001280BD000280ED12046294600F02BF94F +:106D50000EE02046294600F0D8FA09E020462946F0 +:106D600000F0AFFA04E0802001402046FFF7BEFEAD +:106D70000020B0BDF0B583B0029204460191002915 +:106D80001CD025469C350027B4262046394600F005 +:106D9000FDF800280DD0A0598069002809D0297875 +:106DA000032906D1FEF73CFE034620460199029ACC +:106DB000984708367F1C032FE7D12FE094202058F6 +:106DC00003282BD1E16D206E81420AD9091AE165B1 +:106DD000814200D301468AB22046029900F0C7FDE5 +:106DE0001CE026469C360025B4272046294600F0A4 +:106DF000CDF800280BD0E0590069002807D0317881 +:106E0000032904D1FEF70CFE0146204688470837C7 +:106E10006D1C032DE9D1204600F0B0FD002003B029 +:106E2000F0BDF0B581B00446009100291BD0274683 +:106E30009C370026B4252046314600F0A7F80028EC +:106E40000CD060594069002808D03978032905D151 +:106E5000FEF7E6FD02462046009990470835761C6D +:106E6000032EE8D14DE094202058022842D1E06959 +:106E7000266AB0420AD9D022A1588919A150801B94 +:106E8000E06182B2204600F064FD33E0A569284647 +:106E9000314601F067FCB5420FD300290DD198208F +:106EA000205826469836854207D200252046294696 +:106EB0002A4600F04EFD35601CE026469C36002533 +:106EC000B4272046294600F061F800280BD0E0598D +:106ED000C068002807D03178032904D1FEF7A0FD4F +:106EE00001462046884708376D1C032DE9D120460E +:106EF00000F050FDA020205CA034012801D100202A +:106F00002070002001B0F0BD70B504469C20012126 +:106F100021544020206220660025B42620462946C0 +:106F200000F034F8002807D0A0594068FEF778FD3B +:106F3000024621792046904708366D1C032DEDD17D +:106F4000002070BD017400207047002070470020B1 +:106F5000704770B504469C20205C032814D100259E +:106F6000B4262046294600F011F8002808D0A05980 +:106F7000C069002804D0FEF753FD0146204688472B +:106F800008366D1C032DECD1002070BD0246002098 +:106F9000022907D8C8001018B4214158012000293F +:106FA00000D10846704780B54A78042A08DD072AD0 +:106FB0000FDC052A14D0062A1BD100F021F81DE0B1 +:106FC000002A10D0012A17D0032A12D100F034F978 +:106FD00014E0082A0AD0092A0BD100F0BDF80DE010 +:106FE00000F094F80AE000F005F907E000F0EBF893 +:106FF00004E000F0E3FB01E000F03BF9002080BD7D +:10700000B0B582B00D46044601A8002101806A880F +:10701000100A052812DC01281CD0022824D00328DD +:1070200037D1D0B2022839DC00285FD0012865D0E2 +:1070300002282ED1B0202058C0680EE006281CD0AF +:10704000072823D00F2824D1B0202058C069002859 +:1070500003D11EE0B02020580068FEF7E1FC024694 +:10706000207C01A990472FE0B420205800282CD084 +:10707000217C002922D0C06A21E0207C002808D190 +:10708000B4202058002804D0406B18E0207C002851 +:107090000ED02046294600F091FB25E0032829D098 +:1070A00004282FD00528F4D1B02020588069D4E7D7 +:1070B000B42020580028ECD0006B00E0806AFEF776 +:1070C000AFFC014601A88847014601A80288002AB2 +:1070D0000AD0E888002807D0824200D3024601A8DF +:1070E0000280204600F020FC02B0B0BDB020205845 +:1070F0004068B2E7B02020580069AEE7B0202058C1 +:107100008068AAE7B02020584069A6E770B5044619 +:10711000888800280BD1C888002808D148887F2695 +:1071200006409C20205C25469C35032803D1204640 +:1071300000F044FB70BD9E202654F1B22046FFF7BC +:1071400031FD204600F01AFC002E02D002202870EB +:1071500070BD0120287070BD70B50D460446AE7834 +:10716000022E1DD29C20215C20469C30032907D092 +:10717000022915D1002E22D066600321017009E09A +:10718000002E12D06068B04219D0C1B22046FFF77D +:10719000A8FD666020463146FFF788FD02280ED123 +:1071A0002046294600F00AFB70BD0221017066608E +:1071B00020463146FFF795FD204600F0DFFB2046D4 +:1071C00000F0DCFB70BD80B5CA88012A0AD19C2280 +:1071D000825C032A09D0022A04D100218160014681 +:1071E000083103E000F0EAFA80BD011D012200F041 +:1071F0009BFB80BDB0B504469C20205CFE22024073 +:10720000022A15D10120E060A420215825460C3522 +:107210000320002905D0204600F0BCFBE1680220D5 +:107220000843E06002222046294600F07DFBB0BD05 +:10723000204600F0C3FAB0BDB0B50D4604466888DC +:10724000012815D1A42001212150287902280CD829 +:10725000C0002018B4214058002806D08068FEF7EE +:10726000DFFB0246204629469047204600F086FB79 +:10727000B0BDB0B50D4604469C20205CFE21014007 +:10728000022919D1688801281AD1A420002121508F +:10729000287902280CD8C0002018B42140580028B2 +:1072A00006D08068FEF7BCFB024620462946904780 +:1072B000204600F063FBB0BD2046294600F07EFA70 +:1072C000B0BDB0B50D4604469C20205C032816D105 +:1072D0002879022813D8C0002018B421405800286B +:1072E0000DD08068FEF79CFB024620462946904759 +:1072F000E888002807D1204600F040FB03E0204644 +:10730000294600F05BFA0020B0BDB0B50D4604463A +:107310002878602202402979202A0FD102290DD82D +:10732000C8002018B4228058002807D08068FEF7D3 +:1073300077FB024620462946904769E06878002896 +:1073400016D001281DD0032862D19C20205C032880 +:107350001BD16888002807D180200843802803D0EB +:107360002046FFF7C3FB297902294ED8C80040E028 +:107370009C20205C032817D0022810D148060AD18F +:1073800046E09C20205C032827D0022807D18020DB +:10739000084380283CD02046FFF7A8FB38E0204671 +:1073A000294600F00BFA33E07F2008400001201846 +:1073B0000546543514308022114200D0054620463F +:1073C000FFF7DEFB0121002800D1014629600222DF +:1073D0002046294600F0A8FA1AE06888002817D14C +:1073E000480612D02046FFF7A7FB287902280CD8C0 +:1073F000C0002018B4214058002806D08068FEF74D +:107400000FFB0246204629469047204600F0B6FA78 +:107410000020B0BD0A7802704A7842708A78CB7832 +:107420001B02134343800A794B791B021343838069 +:107430008A79C97909021143C180704710B50446A1 +:107440008021FFF753FB00212046FFF74FFB10BDC3 +:1074500070B582B00D46044601A900200880694637 +:1074600008702A7860211140002910D0202938D1D5 +:1074700069780A460A3A022A33D302291BD0032923 +:1074800019D02046294600F099F9022029E06978B0 +:107490000B2913D00A290ED0062922D16888000AA8 +:1074A000002221280ED02228114616D101AE3046E6 +:1074B00000F058F80AE0694601220EE0204600F08C +:1074C0005DFA0DE001AE304600F032F80146328838 +:1074D000E888824200D302463280204600F024FA37 +:1074E0000020C0B202B070BDF0B581B00446822168 +:1074F0000326402532462B46FFF7B2FA02272046E4 +:10750000394632462B46FFF7ABFA204639462A4623 +:10751000FFF773FB002001B0F0BD10B504468221D7 +:10752000FFF7CEFA02212046FFF7CAFA002010BD6D +:10753000AC21094A515C0922012905D0002906D154 +:1075400007497944092204E00449794401E0002212 +:107550001146028008467047FC210020E621000009 +:10756000FA210000F0B581B00446AC201349085C54 +:107570002221002819D001281AD11048812103277F +:1075800040263A463346FFF76BFA01250B48294659 +:107590003A463346FFF764FA084829463246FFF771 +:1075A0002CFB08487844222104E00548784401E097 +:1075B00000210846218001B0F0BDC046FC2100201A +:1075C000BB210000A1210000F0B581B0044681215B +:1075D0000326402532462B46FFF742FA0127204674 +:1075E000394632462B46FFF73BFA204639462A46B3 +:1075F000FFF703FB002001B0F0BD000080B50129BA +:1076000003D103480121FEF75BFE002080BDC04688 +:107610005C210020B0B5144601290DD1012540227E +:107620002946FFF7EAFA2846FDF750FB02460348D1 +:1076300021462B46FEF7A6FF0020B0BD5C210020AE +:1076400080B5022903D103487844FDF79FFF00204D +:1076500080BDC04651D7FFFFB0B51446022919D1ED +:1076600002214022FFF7C9FA0B4DA879002811D159 +:107670000220FDF72BFB0246094878442146FDF71E +:10768000CBFE022806D1072028700120A8710348EC +:10769000006868800020B0BD3C210020E42100206B +:1076A0001FD7FFFF70B504468321032540262A46D5 +:1076B0003346FFF7D5F9204629462A463346FFF7D9 +:1076C000CFF9204629463246FFF797FA002070BDD1 +:1076D000002070470020704780B5032903D103487C +:1076E0007844FDF753FF002080BDC046C9D6FFFF98 +:1076F000B0B51446032919D103214022FFF77DFAC2 +:107700000B4DA879002811D10320FDF7DFFA0246BE +:10771000094878442146FDF77FFE022806D10B2058 +:1077200028700520A8710348006868800020B0BD5B +:107730003C210020E421002097D6FFFF1220088082 +:10774000014878447047C046CA22000004200880DF +:10775000014878447047C046CC2200000E200880C3 +:10776000014878447047C046C02200000E200880BF +:10777000014878447047C046BE2200000A200880B5 +:10778000014878447047C046BC2200000E200880A3 +:10779000014878447047C0469E2200000E200880B1 +:1077A000014878447047C0468E2200003920088086 +:1077B000014878447047C046D71F000080B50A785A +:1077C00052B2002A02DBFFF739FE80BD4A78772AE1 +:1077D0000FD0062AF7D14A88194B9A42F3D1CA88AA +:1077E0001221122A00D30A461649794400F09CF867 +:1077F00080BD8A88042A09D1CA882821282A00D372 +:107800000A461149794400F08FF880BD8A88052A1C +:1078100009D1CA889221922A00D30A460B49794499 +:1078200000F082F880BD8A88072ACCD1CA88B221AC +:10783000B22A00D30A460649794400F075F880BDA3 +:10784000EE030000FA1F0000F21F000000200000FD +:107850007820000070B5044623480025D42229462C +:10786000FDF7BBF9214E30460C3004222946FDF7C6 +:10787000B4F91036082230462946FDF7AEF9002C3F +:107880002DD0194C0025D42220462946FDF7A5F914 +:107890001949794420462A46FFF7C2F9174A7A4423 +:1078A00028462146FFF7F0F90120154A7A4421467F +:1078B000FFF7EAF9FF2252320D480E49FEF7F6FCB7 +:1078C0000220104A7A442146FFF7DEF903214022C4 +:1078D0002046FFF792F92046FFF7E3F970BD024812 +:1078E000FFF7B7F970BDC046FC2100203C21002005 +:1078F0005C210020E81F0020321F0000C62000008D +:10790000F02000001021000060210180014878442F +:107910007047C0463A2100000A210180014878449E +:107920007047C0468A210000B0B50C46942102235E +:107930004350D02144508261C261016A914200D813 +:107940000A4693B2002529462246FFF73DF928460C +:10795000B0BDB0B50C46016A914200D80A4693B258 +:10796000002529462246FFF72FF92846B0BD10B55D +:1079700000242146FFF741F9204610BD10B594219F +:10798000042242500024214622462346FFF71CF9D8 +:10799000204610BD10B594210522425000242146F6 +:1079A0002246FFF72AF9204610BD0000B0B5124963 +:1079B0000A780120012A1DD8521E0C235343CB18EC +:1079C0001A8B002A16D01969002913D09B8A002B24 +:1079D00006D194000C190325ED436459E41C09D128 +:1079E000934206D29A0089180322D2438958891CEF +:1079F00000D00020B0BDC046241D002010B50E49A7 +:107A00000A780120012A16D8521E0C235343CB18A2 +:107A10001A8B002A0FD0196900290CD09B8A541E9A +:107A20009C4208DD921E9A4204DD9A00891849683A +:107A3000891C00D0002010BD241D002008480178BA +:107A400000290AD00C224A4380184189028901206A +:107A50008A4203D8FF208A4200D3002040B27047F8 +:107A6000241D0020F0B581B00146164A1078012887 +:107A700026D8401E0C234343D218168B002E1FD04D +:107A80001569002D1CD0022E1AD3948A1346143384 +:107A9000771EA74214DDB61EA6420ADBA600AD196A +:107AA0006D68AE1C0CD0ED1C03D100211980D18271 +:107AB00004E0D482621C1A80002901D000F03EF854 +:107AC00001B0F0BD241D002080B50120FFF7CAFFE2 +:107AD00080BD0000B0B517490878012829D8401E9C +:107AE0000C22424389180A8B002A22D00C69002CF0 +:107AF0001FD0022A1DD38D8A0B461433002D0AD0C5 +:107B0000AA00A2180324E4431259921C11D0CD827A +:107B1000691E19800BE0950064190325ED43645933 +:107B2000E41C06D1044C14191C80521ECA8200F0B9 +:107B300005F8B0BD241D0020FEFF0000F0B581B0A7 +:107B400004460C2060431A490E183069B18A890036 +:107B500040583746143710360321C943884224D889 +:107B6000FDF75EFF31683A8892008958056808463B +:107B7000FDF756FF002D06D00068FDF751FF0146C6 +:107B80002046884711E08068FDF74AFF05463068C7 +:107B9000398889004058FDF743FF4068FDF740FFF2 +:107BA00002462046294600F061F801B0F0BDC0460B +:107BB000241D0020F0B581B02B4D2878012825D850 +:107BC000401E0C2670432A18108B00281ED0116905 +:107BD00000291BD0928A824218D290000858FDF7E3 +:107BE0001FFF806829784C1E6643002810D0A81912 +:107BF0000169808A80000858FDF712FF8068FDF750 +:107C00000FFF01460022204600F030F801B0F0BD21 +:107C1000A819038B002BF9D0828A014614319B1ED0 +:107C20009342F3DB05699600AE1900967768FE1C57 +:107C300013D0BE1CEAD1009E7668B61C09D1521C36 +:107C400096B2B34204DBB600AE197668B61CF6D025 +:107C50000A80C282501C088002E000220A80C28290 +:107C60002046FFF76BFFD1E7241D0020F0B583B05D +:107C700001920C460C221146029041431F4B5F18A3 +:107C80000021398339617961181DFCF7A6FF204670 +:107C90003C4610343D4618353E461636143700280B +:107CA0002AD0FDF7BDFE206029888A008258521C28 +:107CB00006D0491C8AB292008258521CF9D1298000 +:107CC0000198002815D0FDF7ABFE054620683988DD +:107CD000890040580BE0FDF7A3FEA84209D0388880 +:107CE0003080401C388080B2800021680858411CD8 +:107CF000F1D10298FFF722FF03B0F0BD241D002050 +:107D000080B50A49884208D00949884208D0094903 +:107D1000884208D1FFF7DEFE05E0FFF74BFF02E0E7 +:107D20000120FFF79FFE002080BDC04603000080B9 +:107D3000020000800100008010B5014600200029EB +:107D40000FD1084C218BA28A8A420AD22069FDF702 +:107D500067FEA18A89004058FDF762FE4068FDF782 +:107D60005FFE10BD241D002080B503480078401E32 +:107D7000FFF7E2FF80BDC046241D002010B5044679 +:107D800000F00CFC2420604308490818C421052297 +:107D90004254C021064A7A444250BD210122425435 +:107DA000D021044A7A44425010BDC046241D002010 +:107DB0001E1D000059FFFFFF80B500F0FFFA9D2255 +:107DC000002806D003498A5C112A02D1B422024B52 +:107DD0008B5280BD241D00200A80000010B504468F +:107DE000FFF7CCFF2420604304490818CC21044A43 +:107DF0007A444250204600F0A7FB10BD241D00200D +:107E0000C5FFFFFF80B500F0D9FA9D22002806D0FB +:107E100003498A5C102A02D3B422024B8B5280BDE4 +:107E2000241D00200A80000010B50446FFF7A6FFBD +:107E30002420604304490818CC21044A7A44425063 +:107E4000204600F081FB10BD241D0020C5FFFFFF70 +:107E500070B50546FFF788FF0446114E30469C304A +:107E600020222946FCF7A3FE68780146103905292F +:107E70000AD29D20305C0F21014088002058B82193 +:107E800070509C36304670BD022803D00128F8D1CE +:107E9000616800E0E16800200029F2D1F3E7C04604 +:107EA000241D002010B5044600F078FB2420604318 +:107EB0000B490818C42106224254C021094A7A44B9 +:107EC0004250BD2101224254CC21074A7A444250FB +:107ED000D021064A7A444250204600F035FB10BDBE +:107EE000241D0020961C000081FFFFFF29FEFFFFDC +:107EF000F0B587B00E46FFF71FFF06904B4C2046AB +:107F00000C300025022729463A46FCF766FE20463B +:107F10000E30059529463A46FCF75FFE701C04902A +:107F200002D0A06800287DD006984068FDF778FD53 +:107F3000054600F065FE291801220592012871DB33 +:107F400060680590A068029000200390069001955B +:107F50002B468B42039C1A4620D200201A46044628 +:107F600026469D19C01D741C722813D82F781F2F08 +:107F700004DD202F09D02D2F07D003E0092F04D0D6 +:107F80000A2F09D05F2F00D015462A461D198D42B1 +:107F9000E6D303E0344601E09A19741C18198842AC +:107FA00024D2002C069D22D09A4220D00025ED43F9 +:107FB000455D2C2D06DC2E46093E022E16D3202DC3 +:107FC00014D003E02D2D11D05F2D0FD000782C2878 +:107FD00005DC0546093D022D08D3202802E02D28A6 +:107FE00004D05F28069D02D0D41A00E0069D0498B4 +:107FF000002806D00598A84203D10598029A90421D +:108000000AD31B19681C8B4200D328468B4206906A +:108010009FD3401C059005E004480146CC8101989F +:10802000181A8881059807B0F0BDC046241D0020AD +:10803000B0B50446FFF7A2FE094D69682046FFF778 +:1080400057FF242060432818CC21064A7A44425026 +:10805000D021054A7A444250204600F075FAB0BD5E +:10806000241D00201D00000015010000F0B583B0A4 +:108070000546FFF779FE0446374E30469C302022F5 +:108080002946FCF794FD6878102816DC012833D0C7 +:1080900002283BD010285AD12068002841D0B4686B +:1080A000FDF7BEFC03467068B1686A46401C03C217 +:1080B000012C41D82A4A7A4440E00146113903296B +:1080C00045D20F210840401E40003718FD89002D81 +:1080D0003DD06068FDF7A4FCB98940186946086086 +:1080E00034461C348021204A7A4420462B46FDF732 +:1080F000C3FAB82034502AE0FFF758FC01460020AC +:10810000002924D07168002923D020E0FFF776FCF5 +:1081100000281CD07168B068421E0020914216D120 +:1081200017E07168B0686A46106030461C304B1C1E +:1081300080210C4A7A4404E0084A7A4430461C30D4 +:108140008021FDF799FA30461C30B82170509C36DA +:10815000304603B0F0BDC046241D0020DA1A0000EE +:10816000FA110000EB1A00003D1B000080B5174912 +:1081700088420BD01649884213D01649884222D132 +:108180001548416800291CD0491E14E0124988682E +:10819000002803D04968401E884214D1FFF70AFD29 +:1081A00011E00D4841688268521E914202D1FFF7EA +:1081B0008BFC08E0491C41600078401EFFF738FF47 +:1081C00001E0FFF787FC002080BDC046030000806F +:1081D0000200008001000080241D002070B50446CC +:1081E000FFF72CFC01280BD0401C0FD11C4E301D7A +:1081F00000250C222946FCF7F0FCE843706005E0FE +:108200001748001D00210C22FCF7E7FC204600F077 +:10821000C5F92046FFF790FD4068002819D00020DE +:10822000C1432046FFF764FE0D4DA860002807D12A +:10823000281D00210C22FCF7D0FCA868002804D0DF +:10824000401E6968814200D968602046FFF7F0FE51 +:1082500070BD0348001D00210C22FCF7BEFC70BD60 +:10826000241D002070B50546FFF77EFD0446124E22 +:1082700030469C3020222946FCF799FC68780F286C +:1082800006DC01280AD0022812D1FFF7B7FB07E06D +:1082900010280AD011280BD1606807E0FFF786FB91 +:1082A00001460020002903D070BD2068B82170501D +:1082B0009C36304670BDC046241D002010B50446D3 +:1082C00000F06CF9242060430B490818C4210522F2 +:1082D0004254C021094A7A444250BD2101224254ED +:1082E000CC21074A7A444250D021064A7A4442506F +:1082F000204600F029F910BD241D00205619000069 +:108300007DFFFFFF11FAFFFF70B50546FFF72CFD5B +:108310000446164E30469C3020222946FCF747FC86 +:1083200068780F2807DC012812D0022813D00F2804 +:1083300018D1206809E01038022813D29D20305C43 +:108340000F210140880020184068B821705009E0D2 +:10835000FFF72CFB01E0FFF751FB0146002000294D +:1083600000D070BD9C36304670BDC046241D002034 +:1083700010B5044600F012F9242060430B49081898 +:10838000C42106224254C021094A7A444250BD21E8 +:1083900001224254D021074A7A444250CC21064A55 +:1083A0007A444250204600F0CFF810BD241D002032 +:1083B0004219000065F9FFFF65FFFFFF70B5054634 +:1083C000FFF7D2FC0446124E30469C30202229464C +:1083D000FCF7EDFB6878022804D0012809D1FFF7EB +:1083E000E5FA01E0FFF70AFB0146002000290BD067 +:1083F00070BD9D20305CF021084205D00F2108405F +:1084000080002058B82170509C36304670BDC04660 +:10841000241D0020B0B51749884211D01649884262 +:1084200015D01649884222D1F820154C2158E02554 +:108430006059401E8847002819D06059401E11E03D +:10844000E0200F490858FC22895888470FE0F8209F +:108450000B4C2158E0256059401C8847002806D065 +:108460006059401C60512078401E00F00BF800203D +:10847000B0BDC04603000080020000800100008003 +:10848000241D0020F0B581B004460120C6430C4DE8 +:108490002F46E437F8202958E0202858301888471C +:1084A00001C7761C032EF5D12046FFF7FBFC2420E4 +:1084B00060432818D021034A7A44425001B0F0BDED +:1084C000241D002059FFFFFFB0B50446F8200B4DD6 +:1084D0002950E0202B50FC202A502046FFF72CFC8E +:1084E000E435A84206D00649794400222046FFF729 +:1084F000BDFBB0BD2046FFF7C5FFB0BD241D002069 +:10850000B418000080B50023FFF7DEFF80BD000037 +:10851000B0B50C4D2878002811D12846BC30002475 +:1085200024222146FCF759FB28780C2250432818B6 +:1085300010302146FCF751FB2878401C2870C0B24F +:10854000401EB0BD241D0020B0B50446124802787C +:10855000002A0ED0611C91420BD1242161434518A1 +:10856000FCF7AEFCBE2000212952204600F02AF87C +:10857000B0BD01210023002A0A4600D01A46641C1F +:1085800000D019461143012904D14178AA2901D10B +:1085900069214170B0BDC046241D002070B524245F +:1085A000604307490E18FCF78BFC3046BC300025B1 +:1085B00029462246FCF711FBBC20355470BDC0464D +:1085C000241D0020F0B581B004460420FDF7EEFC28 +:1085D00000283CD097283AD0242060431D490C182D +:1085E000C02020582546C0352646BE3600282ED04D +:1085F0002046CC300090C4343088AA27217880B23D +:10860000884224D2FDF79EFC002820D1FDF71CFCF7 +:10861000B84203D1FDF742FCB84218D1286831882E +:108620004901401800990968002902D088470028AC +:1086300007D0012803D12868318849014018FBF789 +:10864000A2FB3088401C308029680029D6D101B0B7 +:10865000F0BDC046241D0020002243088B4274D385 +:1086600003098B425FD3030A8B4244D3030B8B4233 +:1086700028D3030C8B420DD3FF22090212BA030C3C +:108680008B4202D31212090265D0030B8B4219D31D +:1086900000E0090AC30B8B4201D3CB03C01A52413D +:1086A000830B8B4201D38B03C01A5241430B8B4285 +:1086B00001D34B03C01A5241030B8B4201D30B036E +:1086C000C01A5241C30A8B4201D3CB02C01A524195 +:1086D000830A8B4201D38B02C01A5241430A8B4258 +:1086E00001D34B02C01A5241030A8B4201D30B0241 +:1086F000C01A5241CDD2C3098B4201D3CB01C01A5B +:10870000524183098B4201D38B01C01A5241430964 +:108710008B4201D34B01C01A524103098B4201D352 +:108720000B01C01A5241C3088B4201D3CB00C01ABF +:10873000524183088B4201D38B00C01A5241430837 +:108740008B4201D34B00C01A5241411A00D201465C +:10875000524110467047FFE701B5002000F0F0F8E5 +:1087600002BDC0460029F7D076E7704703460B43A9 +:108770007FD4002243088B4274D303098B425FD31A +:10878000030A8B4244D3030B8B4228D3030C8B4246 +:108790000DD3FF22090212BA030C8B4202D312122C +:1087A000090265D0030B8B4219D300E0090AC30B01 +:1087B0008B4201D3CB03C01A5241830B8B4201D3AE +:1087C0008B03C01A5241430B8B4201D34B03C01A97 +:1087D0005241030B8B4201D30B03C01A5241C30A0F +:1087E0008B4201D3CB02C01A5241830A8B4201D380 +:1087F0008B02C01A5241430A8B4201D34B02C01A6A +:108800005241030A8B4201D30B02C01A5241CDD20E +:10881000C3098B4201D3CB01C01A524183098B4259 +:1088200001D38B01C01A524143098B4201D34B0142 +:10883000C01A524103098B4201D30B01C01A5241A5 +:10884000C3088B4201D3CB00C01A524183088B422C +:1088500001D38B00C01A524143088B4201D34B0015 +:10886000C01A5241411A00D2014652411046704787 +:108870005DE0CA0F00D04942031000D3404253408C +:1088800000229C4603098B422DD3030A8B4212D34C +:10889000FC22890112BA030A8B420CD3890192117E +:1088A0008B4208D3890192118B4204D389013AD0BB +:1088B000921100E08909C3098B4201D3CB01C01A90 +:1088C000524183098B4201D38B01C01A52414309A3 +:1088D0008B4201D34B01C01A524103098B4201D391 +:1088E0000B01C01A5241C3088B4201D3CB00C01AFE +:1088F000524183088B4201D38B00C01A5241D9D216 +:1089000043088B4201D34B00C01A5241411A00D296 +:108910000146634652415B10104601D34042002B92 +:1089200000D54942704763465B1000D3404201B511 +:10893000002000F005F802BD0029F8D016E77047C6 +:108940007047C04610B5002200F00AF810BDC046BE +:1089500010B500F031F810BD10B500F07FF810BD73 +:108960000B0010B511001A0000F0D4F810BDC0467D +:1089700030B5032A0CD903000B439B0719D10368B8 +:108980000C68A34215D1043A04300431032AF6D806 +:10899000551E002A0BD0002303E05A1C9D4206D02E +:1089A0001300C25CCC5CA242F7D0101B00E0002098 +:1089B00030BD551EEFE7C046F0B5C64600B50F2ADC +:1089C00041D903270D003E0005430C0003002E4053 +:1089D0002F423DD11500103D2D09AC462D01A84672 +:1089E0008044256867681D605F60A568E7689D60D2 +:1089F000DF6010341F0010334745F2D165460F2366 +:108A00000C2401352D01491913404519144222D077 +:108A10008C59AC5104369C1B032CF9D80324043B1D +:108A20009B0801339B002240ED18C918561E002AEE +:108A300006D00023CC5C1A00EC5401339642F9D1E5 +:108A400080BCB846F0BD0500561E002AF1D1F7E7FC +:108A50000500561EEDE71A00F6E7C046F0B5C6461B +:108A600000B588420CD98B18984209D2531E002AAF +:108A700003D0CA5CC254013BFBD280BCB846F0BDF7 +:108A80000F2A0BD80500561E002AF6D00023CC5C16 +:108A90001A00EC5401339642F9D1EEE703270D009A +:108AA0003E0005430C0003002E402F422CD1150040 +:108AB000103D2D09AC462D01A846804425681F00B5 +:108AC0001D6065685D60A5689D60E5681034DD60C7 +:108AD00010334745F2D165460F230C2401352D0193 +:108AE000491913404519144211D08C59AC51043620 +:108AF0009C1B032CF9D80324043B9B0801339B00E7 +:108B0000ED18C9182240BEE70500561EBEE71A0040 +:108B1000B9E7C046F0B5050083074AD0541E002AC5 +:108B200044D003000322CEB202E00135013C3DD324 +:108B300001332E701342F8D1032C2FD9FF220A40A3 +:108B4000150215432A0415430F2C35D92700103F71 +:108B50003F093E01B4461E001A00103666441560F7 +:108B600055609560D5601032B242F8D10F260C22C4 +:108B700001373F012640DB193700224217D03E1F44 +:108B8000B608B400A4461A001C1D644420C2A242C8 +:108B9000FCD103240136B6009B193C40002C05D0C3 +:108BA000C9B21C19197001339C42FBD1F0BD3400CD +:108BB000F4E714000300BFE72700E0E7F0C04146F8 +:108BC0004A4653465C466D4676467EC02838F0C815 +:108BD0000020704710307CC890469946A246AB46AC +:108BE000B54608C82838F0C8081C00D1012018472D +:108BF00003000A7801311A700133002AF9D1704755 +:108C000010B583070AD00300032102E001330B42B1 +:108C100005D01A78002AF9D1181A10BD0300196876 +:108C20000C4A0D4C8A188A4322420FD15968094ACE +:108C300004338A188A43224208D15968054A04330A +:108C40008A188A432242F1D000E001331A78002AC0 +:108C5000FBD1E1E7FFFEFEFE8080808030B5002A78 +:108C600028D003000B439B0713D1032A11D9134DBE +:108C70000BE0043A002A1DD0114C1C199C432C42D5 +:108C800018D104300431032A03D903680C68A342C5 +:108C9000EFD004780D78A5420ED1012A0AD0012325 +:108CA00006E0C45CCD5CAC4206D101339A4201D0EF +:108CB000002CF6D1002030BD601BFCE78080808056 +:108CC000FFFEFEFEF0B50C00044303000600A407FF +:108CD00012D1032A10D9144CA44666460D68134CD1 +:108CE0001F002C19AC4334421CD10433043A1E003B +:108CF00004313D60032AF0D80024B71806E00D5D6A +:108D0000013A3555BB1A0134002D02D0002AF6D1A4 +:108D1000F0BD0021D418002AFAD0197001339C420A +:108D2000FBD1F5E71E00E7E780808080FFFEFEFEB6 +:108D300030B5050008002B006C18002903D106E0AF +:108D400001339C4203D01A78002AF9D1581B30BD58 +:108D500025303858001976A91488AC17A914873D16 +:108D6000A91487209EC9845ACB02FAB24E1C03680C +:108D7000B3B517C1A4488FBA97F0E3459AC053EA38 +:108D80000100000003C01F02B41600142200203F9F +:108D900076A91488AC209EC9845ACB02FAB24E1C24 +:108DA0000368B3B517C1A4488FBA97F0E3459AC0DA +:108DB00053EA0100000003C01F02B4232102232153 +:108DC00003434104AC25750031323334353637382E +:108DD0003941424344454647484A4B4C4D4E505119 +:108DE00052535455565758595A61626364656667C1 +:108DF00068696A6B6D6E6F7071727374757677786F +:108E0000797AE0E0E0E0E0E0E0E0E0E0E0E0E020EF +:108E1000222426404244484A4EC0C41601010001A3 +:108E2000010101010101000000000000A117D0C0F4 +:108E3000B11CD0C07103D0C0DD16D0C0CD05D0C0EC +:108E40002504D0C00912D0C00914D0C08910D0C0E8 +:108E5000411CD0C0E903D0C02503D0C05502D0C00A +:108E6000626974636F696E636173680071707A72AE +:108E700079397838676632747664773073336A6E1E +:108E800035346B686365366D7561376C00000000C2 +:108E900000000000FFFFFF00000000000C400BF886 +:108EA00007FCC0F3F03CF003FE012D0003000000BE +:108EB000000000000E0000000E0000000100000095 +:108EC000908ED0C0988ED0C000000000FFFFFF0041 +:108ED000008001E6C071383807FC001E8007F003EF +:108EE000CEC1E13870061800000000000E0000003E +:108EF0000E00000001000000C88ED0C0D08ED0C08F +:108F000000000000FFFFFF00000000000C8007F0E1 +:108F100003FEC1FFF03FF003CC0033C00C000000A3 +:108F2000000000000E0000000E0000000100000024 +:108F3000008FD0C0088FD0C000000000FFFFFF00EE +:108F400041110501070000000400000001000000BD +:108F5000388FD0C0408FD0C000000000FFFFFF005E +:108F6000000000001EE01F1C0E03638C19630C0C34 +:108F700087837F8007000000000000000E000000D3 +:108F80000E00000001000000588FD0C0608FD0C0DC +:108F900000000000FFFFFF0048124208040000002C +:108FA0000700000001000000908FD0C0988FD0C053 +:108FB00000000000FFFFFF002184240104000000E6 +:108FC0000700000001000000B08FD0C0B88FD0C0F3 +:108FD00000000000FFFFFF00088A280807000000CB +:108FE0000400000001000000D08FD0C0D88FD0C096 +:108FF00000000000FFFFFF00000000000000C000B4 +:10900000380067E0381C9C037E000F8001000000E0 +:10901000000000000E0000000E0000000100000033 +:10902000F08FD0C0F88FD0C000000000FFFFFF001D +:10903000000030000C80072001CC0033E01C380712 +:10904000FFC3F3F87CFE1F00000000000E000000CC +:109050000E000000010000002890D0C03090D0C069 +:109060004175746F20417070726F76616C004D6154 +:109070006E75616C20417070726F76616C00426138 +:10908000636B005075626C6963206B657973206552 +:1090900078706F7274004170706C69636174696F8D +:1090A0006E00697320726561647900536574746938 +:1090B0006E67730056657273696F6E00312E352EC0 +:1090C000330051756974005369676E006D65737381 +:1090D000616765004D6573736167652068617368DA +:1090E0000043616E63656C007369676E61747572CD +:1090F0006500526576696577007472616E736163AD +:1091000074696F6E00416D6F756E740041646472B6 +:109110006573730046656573004163636570740031 +:10912000616E642073656E640052656A65637400E5 +:109130004F505F53454E44455200436F6E6669720F +:109140006D005468652064657269766174696F6E3C +:10915000007061746820697320756E757375616C39 +:10916000210044657269766174696F6E2070617464 +:10917000680052656A65637420696620796F752797 +:109180007265006E6F742073757265004170707245 +:109190006F76652064657269766174696F6E0041EF +:1091A0007070726F766500436F6E6669726D2074C1 +:1091B0006F6B656E004578706F7274007075626CCD +:1091C0006963206B65793F00546865206368616E50 +:1091D0006765207061746800697320756E757375BA +:1091E000616C004368616E6765207061746800544B +:1091F0006865207369676E207061746800536967E1 +:109200006E207061746800556E7665726966696576 +:109210006420696E707574730055706461746500C4 +:10922000204C6564676572204C697665006F72201A +:1092300074686972642070617274790077616C6C13 +:10924000657420736F66747761726500436F6E7426 +:10925000696E7565004F505F53454E4445525F43FC +:109260005245415445004F505F43524541544500DB +:109270004C0E968C0044656C656761746520746F54 +:109280002025732028666565202564202525290072 +:109290003D666E8B003031323334353637383941E4 +:1092A00042434445460043616C6C20636F6E7472A8 +:1092B000616374202573006F6D6E69004F4D4E49D8 +:1092C00020005553445420004D41494420004F4D47 +:1092D0004E492061737365742025642000252E2A71 +:1092E000482E2E2E252E2A48006F75747075742016 +:1092F000232564005174756D005154554D00716300 +:10930000000000006090D0C06E90D0C07E90D0C0B1 +:109310008390D0C07E90D0C09690D0C0A290D0C094 +:10932000297ED0C01893D0C00000000000000000CB +:10933000D13CD0C000000000000000000000000090 +:109340003093D0C0FFFFFFFFB48ED0C0AB90D0C031 +:10935000BD82D0C04893D0C04093D0C00000000070 +:10936000B490D0C0BC90D0C0DD7DD0C06093D0C0E0 +:109370000000000000000000ED3CD0C00000000034 +:1093800000000000000000007893D0C0FFFFFFFF46 +:10939000248FD0C0C290D0C0BD82D0C09093D0C026 +:1093A0008893D0C0000000002093D0C05093D0C05C +:1093B0006893D0C09893D0C0FDFFFFFFFFFFFFFF71 +:1093C000F73CD0C0000000000000000000000000DA +:1093D000C093D0C0FFFFFFFF1490D0C0A791D0C0B2 +:1093E000B02000207183D0C0D893D0C0D093D0C01B +:1093F00000000000053DD0C000000000000000009B +:1094000000000000F493D0C0FFFFFFFFEC8ED0C03F +:109410002991D0C0BD82D0C00C94D0C00494D0C0DB +:1094200000000000E493D0C01494D0C0FFFFFFFF01 +:10943000133DD0C00000000000000000000000004C +:109440003094D0C0FFFFFFFF1490D0C0B591D0C0C2 +:10945000BC91D0C07183D0C04894D0C04094D0C0DB +:1094600000000000213DD0C000000000000000000E +:10947000000000006494D0C0FFFFFFFFEC8ED0C05E +:109480002991D0C0BD82D0C07C94D0C07494D0C08B +:10949000000000005494D0C08494D0C0FFFFFFFFB0 +:1094A0007C8FD0C0C891D0C0D891D0C07183D0C0BB +:1094B000A094D0C00000000000000000E391D0C0E4 +:1094C00000180020DD81D0C0BC94D0C00000000096 +:1094D000000000002F3DD0C0000000000000000090 +:1094E00000000000D494D0C0FFFFFFFFEC8ED0C07E +:1094F0007291D0C08391D0C07183D0C0EC94D0C0A1 +:10950000E494D0C0000000003D3DD0C00000000049 +:1095100000000000000000000895D0C0FFFFFFFF22 +:109520001490D0C09F91D0C0BD82D0C02095D0C033 +:109530001895D0C000000000AC94D0C0C494D0C036 +:10954000F894D0C02895D0C0FFFFFFFF7C8FD0C01B +:10955000EF91D0C0D891D0C07183D0C04C95D0C00D +:109560000000000000000000FD91D0C000180020A5 +:10957000DD81D0C06895D0C0000000000000000070 +:109580004B3DD0C0000000000000000000000000C3 +:109590008095D0C0FFFFFFFFEC8ED0C07291D0C08D +:1095A0008391D0C07183D0C09895D0C09095D0C021 +:1095B000000000005B3DD0C0000000000000000083 +:1095C00000000000B495D0C0FFFFFFFF1490D0C092 +:1095D0009F91D0C0BD82D0C0CC95D0C0C495D0C022 +:1095E000000000005895D0C07095D0C0A495D0C0A0 +:1095F000D495D0C0FFFFFFFF4C90D0C00792D0C0E1 +:10960000BD82D0C0F895D0C000000000000000006E +:109610001992D0C02092D0C0297ED0C01096D0C060 +:1096200000000000000000002D92D0C03C92D0C08D +:10963000297ED0C02896D0C00000000000000000A5 +:109640006B3DD0C0000000000000000000000000E2 +:109650004096D0C0FFFFFFFFEC8ED0C0E190D0C09D +:10966000BD82D0C05896D0C05096D0C00000000037 +:10967000793DD0C0000000000000000000000000A4 +:109680007096D0C0FFFFFFFF1490D0C04C92D0C0A6 +:10969000BD82D0C08896D0C08096D0C000000000A7 +:1096A0000096D0C01896D0C03096D0C06096D0C07A +:1096B0009096D0C0FFFFFFFF4F505F524554555268 +:1096C0004E000000556E64656C656761746500004E +:1096D00000000000B001000000B0A7000000B002D0 +:1096E0000000003031323334353637383961626347 +:1096F0006465663031323334353637383941424368 +:109700004445466F00900167006985F1D000000074 +:10971000004254430090009000006A805532465F3A +:1097200056329000010990006E006D00FFFFFFFFB0 +:109730000000000009211101210122220000000087 +:1097400009211101000122220006D0F10901A10125 +:109750000903150026FF00750895408108090415C6 +:109760000026FF00750895409108C006A0FF09017A +:10977000A1010903150026FF00750895408108091D +:1097800004150026FF00750895409108C0050F39A3 +:1097900000021810050038B60834A909A0478BFD4F +:1097A000A0768815B66500011E001C100500DF605C +:1097B000DDD88945C74C9CD2659D9E648A9F000078 +:1097C0000306B200770000003D77D0C04D77D0C0CF +:1097D0005D77D0C06D77D0C07D77D0C08D77D0C099 +:1097E0009D77D0C0AD77D0C012034D005300460026 +:1097F00054003100300030007700280000000001E4 +:1098000004000100000000000000020157494E550D +:1098100053420000000000000000000000000000B3 +:109820000000920000000001050001008800000017 +:10983000070000002A00440065007600690063000C +:10984000650049006E0074006500720066006100EA +:1098500063006500470055004900440073000000A4 +:10986000500000007B0031003300640036003300FC +:109870003400300030002D00320043003900370042 +:109880002D0030003000300034002D00300030005A +:10989000300030002D003400630036003500360003 +:1098A00034003600370036003500370032007D00C6 +:1098B000000000000A00000000000306B2000800DB +:1098C00001000000A800080002000200A00014002F +:1098D000030057494E5553420000000000000000AD +:1098E00000008400040007002A00440065007600A0 +:1098F00069006300650049006E0074006500720035 +:10990000660061006300650047005500490044009F +:109910007300000050007B00430045003800300019 +:1099200039003200360034002D003400420032008D +:1099300034002D0034004500380031002D00410076 +:109940003800420032002D00350037004500440049 +:10995000300031004400350038003000450031004F +:109960007D00000000000000E974D0C01B75D0C06D +:109970005174D0C000000000000000004176D0C04B +:109980005976D0C000000000000000000000000078 +:109990000979D0C00979D0C00979D0C01979D0C06F +:1099A000C975D0C01B75D0C05174D0C00000000074 +:1099B00000000000FD75D0C01576D0C0000000008A +:1099C00000000000000000000979D0C00979D0C073 +:1099D0000979D0C01979D0C0A576D0C0D176D0C0D1 +:1099E000D576D0C00000000000000000D976D0C0BD +:1099F000F176D0C000000000000000000000000070 +:109A00000979D0C00979D0C00979D0C01979D0C0FE +:109A10001201100200000040972C01000102010217 +:109A20000301040309040E034C0065006400670091 +:109A3000650072000E034E0061006E006F00200092 +:109A400053000A033000300030003100090260008A +:109A5000030102C0320904000002030000020921D0 +:109A600011010001222200070582034000010705C1 +:109A7000020340000109040100020301010209215F +:109A80001101210122220007058103400001070581 +:109A900001034000010904020002FFFFFF02070565 +:109AA0008303400001070503034000010A0600028A +:109AB00000000040010000000300000000008000E2 +:109AC000200000000100000000000000FFFFFF0078 +:109AD0000000000000000000050102000C0004006E +:109AE0000700000000000000FFFFFF000000000072 +:109AF000000000009C8FD0C005027A000C0004001A +:109B00000700000000000000FFFFFF000000000051 +:109B100000000000BC8FD0C0071000000C008000C7 +:109B20002000000000000000FFFFFF000000000018 +:109B30000880000000000000071100001A008000EB +:109B40002000000000000000FFFFFF0000000000F8 +:109B500008800000000000000300000000008000FA +:109B6000200000000100000000000000FFFFFF00D7 +:109B70000000000000000000050100000E000700CA +:109B80000400000000000000FFFFFF0000000000D4 +:109B900000000000DC8FD0C0050278000E00070036 +:109BA0000400000000000000FFFFFF0000000000B4 +:109BB00000000000448FD0C00711000003008000A7 +:109BC0002000000000000000FFFFFF000000000078 +:109BD0000A8000000000000007120000130080004F +:109BE0002000000000000000FFFFFF000000000058 +:109BF0000880000000000000071300002300800020 +:109C00002000000000000000FFFFFF000000000037 +:109C10000A800000000000002573202825642F25FD +:109C200064290025642F256400252E2A7300000076 +:109C30000300000000008000200000000100000080 +:109C400000000000FFFFFF00000000000000000017 +:109C5000050102000C0004000700000000000000E5 +:109C6000FFFFFF0000000000000000009C8FD0C03C +:109C700005027A000C00040007000000000000004C +:109C8000FFFFFF000000000000000000BC8FD0C0FC +:109C90000510380002001000100000000000000055 +:109CA000FFFFFF00000000000A800000000000002D +:109CB000071100001C0080002000000000000000D0 +:109CC000FFFFFF000000000008800000000000000F +:109CD00003000000000080002000000001000000E0 +:109CE00000000000FFFFFF00000000000000000077 +:109CF000050102000C000400070000000000000045 +:109D0000FFFFFF0000000000000000009C8FD0C09B +:109D100005027A000C0004000700000000000000AB +:109D2000FFFFFF000000000000000000BC8FD0C05B +:109D3000050F1000080010001000000000000000D7 +:109D4000FFFFFF0000000000000000000000000016 +:109D5000071029000C008000200000000000000017 +:109D6000FFFFFF00000000000800000000000000EE +:109D7000071129001A0080002000000000000000E8 +:109D8000FFFFFF00000000000800000000000000CE +:109D90008584D0C0081E00200000000000000000E4 +:109DA000909DD0C0FFFFFFFF0000000000000000FA +:109DB00000000000000000000000000000000000A3 +:109DC0000000000000000000000000000000000093 +:109DD0000000000000000000000000000000000083 +:109DE0000000000000000000000000000000000073 +:109DF0000000000000000000000000000000000063 :04000005C0D0000166 :00000001FF From 66a75ee184656bf4ae9ed6b91bd45239a460df1f Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 23 Apr 2021 16:39:59 +0200 Subject: [PATCH 126/164] Check staker closing when sing with hwi --- src/validation.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/validation.cpp b/src/validation.cpp index 18ec469649..74be24d174 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -4795,6 +4795,7 @@ bool SignBlockHWI(std::shared_ptr pblock, CWallet& wallet, std::vector pblock, CWallet& wallet, std::vectorhashMerkleRoot = BlockMerkleRoot(*pblock); // Sign block header + if(wallet.IsStakeClosing()) return false; std::string header = pblock->GetWithoutSign(); if(!device.signBlockHeader(wallet.m_ledger_id, header, strStaker, vchSig)) { return false; @@ -4831,7 +4833,7 @@ bool SignBlockLedger(std::shared_ptr pblock, CWallet& wallet, std::vecto { LOCK(cs_ledger); bool ret = SignBlockHWI(pblock, wallet, vchSig); - if(!ret) + if(!ret && !wallet.IsStakeClosing()) { std::string errorMessage = QtumLedger::instance().errorMessage(); LogPrintf("WARN: %s: fail to sign block (%s)\n", __func__, errorMessage); From 8bef72409ee93adfaa79a0bd89c7d775f2249971 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Wed, 28 Apr 2021 11:53:58 +0200 Subject: [PATCH 127/164] Update the command for getkeypool to include the path parameter --- src/qt/qtumhwitool.cpp | 2 +- src/qtum/qtumledger.cpp | 18 +++++++++++++----- src/qtum/qtumledger.h | 9 ++++++--- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 4f50eed339..bf55d3535c 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -145,7 +145,7 @@ bool QtumHwiTool::getKeyPool(const QString &fingerprint, int type, QString &desc LOCK(cs_ledger); std::string strFingerprint = fingerprint.toStdString(); std::string strDesc = desc.toStdString(); - bool ret = QtumLedger::instance().getKeyPool(strFingerprint, type, strDesc); + bool ret = QtumLedger::instance().getKeyPool(strFingerprint, type, "", false, strDesc); desc = QString::fromStdString(strDesc); if(ret) { diff --git a/src/qtum/qtumledger.cpp b/src/qtum/qtumledger.cpp index 15b57bd656..372cb19cc7 100644 --- a/src/qtum/qtumledger.cpp +++ b/src/qtum/qtumledger.cpp @@ -362,7 +362,7 @@ bool QtumLedger::signMessage(const std::string &fingerprint, const std::string & return endSignMessage(fingerprint, message, path, signature); } -bool QtumLedger::getKeyPool(const std::string &fingerprint, int type, std::string &desc) +bool QtumLedger::getKeyPool(const std::string &fingerprint, int type, const std::string& path, bool internal, std::string &desc) { LOCK(cs_ledger); // Check if tool exists @@ -373,12 +373,12 @@ bool QtumLedger::getKeyPool(const std::string &fingerprint, int type, std::strin if(isStarted()) return false; - if(!beginGetKeyPool(fingerprint, type, desc)) + if(!beginGetKeyPool(fingerprint, type, path, internal, desc)) return false; wait(); - return endGetKeyPool(fingerprint, type, desc); + return endGetKeyPool(fingerprint, type, path, internal, desc); } std::string QtumLedger::errorMessage() @@ -540,7 +540,7 @@ bool QtumLedger::endSignMessage(const std::string &, const std::string &, const return false; } -bool QtumLedger::beginGetKeyPool(const std::string &fingerprint, int type, std::string &) +bool QtumLedger::beginGetKeyPool(const std::string &fingerprint, int type, const std::string& path, bool internal, std::string &) { // Get the output type std::string descType; @@ -560,6 +560,14 @@ bool QtumLedger::beginGetKeyPool(const std::string &fingerprint, int type, std:: arguments << "-f" << fingerprint << "getkeypool"; if(descType != "") arguments << descType; + if(path != "") + { + arguments << "--path" << path; + if(internal) + { + arguments << "--internal"; + } + } arguments << "0" << "1000"; d->process.start(d->toolPath, arguments); d->fStarted = true; @@ -567,7 +575,7 @@ bool QtumLedger::beginGetKeyPool(const std::string &fingerprint, int type, std:: return d->fStarted; } -bool QtumLedger::endGetKeyPool(const std::string &, int , std::string &desc) +bool QtumLedger::endGetKeyPool(const std::string &, int, const std::string& , bool, std::string &desc) { // Decode command line results bool ret = d->strStdout.find("desc")!=std::string::npos; diff --git a/src/qtum/qtumledger.h b/src/qtum/qtumledger.h index 830fb903d0..eee652bdf2 100644 --- a/src/qtum/qtumledger.h +++ b/src/qtum/qtumledger.h @@ -91,10 +91,13 @@ class QtumLedger { * @brief getKeyPool Get the key pool for a device * @param fingerprint Hardware wallet device fingerprint * @param type Type of output + * @param path The derivation path, if empty it is used the default + * @param internal Needed when the derivation path is specified, to determine if the address pool is for change addresses. + * If path is empty both internal and external addresses are loaded into the pool, so the parameter is not used. * @param desc Address descriptors * @return success of the operation */ - bool getKeyPool(const std::string& fingerprint, int type, std::string& desc); + bool getKeyPool(const std::string& fingerprint, int type, const std::string& path, bool internal, std::string& desc); /** * @brief errorMessage Get the last error message @@ -126,8 +129,8 @@ class QtumLedger { bool beginSignMessage(const std::string& fingerprint, const std::string& message, const std::string& path, std::string &signature); bool endSignMessage(const std::string& fingerprint, const std::string& message, const std::string& path, std::string &signature); - bool beginGetKeyPool(const std::string& fingerprint, int type, std::string& desc); - bool endGetKeyPool(const std::string& fingerprint, int type, std::string& desc); + bool beginGetKeyPool(const std::string& fingerprint, int type, const std::string& path, bool internal, std::string& desc); + bool endGetKeyPool(const std::string& fingerprint, int type, const std::string& path, bool internal, std::string& desc); private: QtumLedger(const QtumLedger&); From 4138f8d298460e60a1a66712b30fb742df449fd6 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Wed, 28 Apr 2021 12:29:17 +0200 Subject: [PATCH 128/164] Add default derivation paths for ledger --- src/qtum/qtumledger.cpp | 19 +++++++++++++++++++ src/qtum/qtumledger.h | 11 +++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/qtum/qtumledger.cpp b/src/qtum/qtumledger.cpp index 372cb19cc7..5ae3be44a1 100644 --- a/src/qtum/qtumledger.cpp +++ b/src/qtum/qtumledger.cpp @@ -583,3 +583,22 @@ bool QtumLedger::endGetKeyPool(const std::string &, int, const std::string& , bo return ret; } + +std::string QtumLedger::derivationPath(int type) +{ + std::string derivPath; + switch (type) { + case (int)OutputType::P2SH_SEGWIT: + derivPath = "m/49h/88h/0h/1/*"; + break; + case (int)OutputType::BECH32: + derivPath = "m/84h/88h/0h/1/*"; + break; + case (int)OutputType::LEGACY: + derivPath = "m/44h/88h/0h/1/*"; + break; + default: + break; + } + return derivPath; +} diff --git a/src/qtum/qtumledger.h b/src/qtum/qtumledger.h index eee652bdf2..98a3a85b21 100644 --- a/src/qtum/qtumledger.h +++ b/src/qtum/qtumledger.h @@ -111,8 +111,19 @@ class QtumLedger { */ bool toolExists(); + /** + * @brief instance Get the ledger instance + * @return + */ static QtumLedger &instance(); + /** + * @brief derivationPath Get the default derivation path + * @param type Type of output + * @return Default derivation path + */ + static std::string derivationPath(int type); + private: bool isStarted(); void wait(); From 493419c79cc19d3bf8e23cf6c03b41eac3eeedaf Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Wed, 28 Apr 2021 14:24:33 +0200 Subject: [PATCH 129/164] Display import addresses error message --- src/qt/walletmodel.cpp | 46 +++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index f76703a670..a9dcf022fa 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -876,26 +876,54 @@ void WalletModel::checkHardwareWallet() if(hwiTool.isConnected(fingerprint)) { // Setup key pool - QString pkhdesc; - if(importPKH && hwiTool.getKeyPoolPKH(fingerprint, pkhdesc)) + QString errorMessage; + if(importPKH) { - hwiTool.importMulti(pkhdesc); + QString pkhdesc; + bool OK = hwiTool.getKeyPoolPKH(fingerprint, pkhdesc); + if(OK) OK &= hwiTool.importMulti(pkhdesc); + + if(!OK) + { + errorMessage = tr("Import PKH failed: ") + hwiTool.errorMessage(); + } } - QString p2shdesc; - if(importP2SH && hwiTool.getKeyPoolP2SH(fingerprint, p2shdesc)) + if(importP2SH) { - hwiTool.importMulti(p2shdesc); + QString p2shdesc; + bool OK = hwiTool.getKeyPoolP2SH(fingerprint, p2shdesc); + if(OK) OK &= hwiTool.importMulti(p2shdesc); + + if(!OK) + { + errorMessage += "\n"; + errorMessage = tr("Import PKH failed: ") + hwiTool.errorMessage(); + } } - QString bech32desc; - if(importBech32 && hwiTool.getKeyPoolP2SH(fingerprint, bech32desc)) + if(importBech32) { - hwiTool.importMulti(bech32desc); + QString bech32desc; + bool OK = hwiTool.getKeyPoolBech32(fingerprint, bech32desc); + if(OK) OK &= hwiTool.importMulti(bech32desc); + + if(!OK) + { + errorMessage += "\n"; + errorMessage = tr("Import Bech32 failed: ") + hwiTool.errorMessage(); + } } // Rescan the chain if(rescan) hwiTool.rescanBlockchain(); + + // Display error message if happen + if(errorMessage.isEmpty()) + { + Q_EMIT message(tr("Import addresses"), errorMessage, + CClientUIInterface::MSG_ERROR | CClientUIInterface::MSG_NOPREFIX); + } } hardwareWalletInitRequired = false; From f328e8287948fac67f81a21cfda384d7763cf492 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Wed, 28 Apr 2021 15:43:30 +0200 Subject: [PATCH 130/164] Update get key pool with path parameter for hwi tool --- src/qt/qtumhwitool.cpp | 49 ++++++++++++++++++++++++++++++++++-------- src/qt/qtumhwitool.h | 42 ++++++++++++++++++++++++++++-------- src/qt/walletmodel.cpp | 19 +++++++++------- src/qt/walletmodel.h | 5 ++++- 4 files changed, 88 insertions(+), 27 deletions(-) diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index bf55d3535c..319ba22dac 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -140,12 +140,13 @@ bool QtumHwiTool::isConnected(const QString &fingerprint) return ret; } -bool QtumHwiTool::getKeyPool(const QString &fingerprint, int type, QString &desc) +bool QtumHwiTool::getKeyPool(const QString &fingerprint, int type, const QString& path, bool internal, QString &desc) { LOCK(cs_ledger); std::string strFingerprint = fingerprint.toStdString(); std::string strDesc = desc.toStdString(); - bool ret = QtumLedger::instance().getKeyPool(strFingerprint, type, "", false, strDesc); + std::string strPath = path.toStdString(); + bool ret = QtumLedger::instance().getKeyPool(strFingerprint, type, strPath, internal, strDesc); desc = QString::fromStdString(strDesc); if(ret) { @@ -158,19 +159,37 @@ bool QtumHwiTool::getKeyPool(const QString &fingerprint, int type, QString &desc return ret; } -bool QtumHwiTool::getKeyPoolPKH(const QString &fingerprint, QString &desc) +bool QtumHwiTool::getKeyPool(const QString &fingerprint, int type, const QString &path, QStringList &descs) { - return getKeyPool(fingerprint, (int)OutputType::LEGACY, desc); + LOCK(cs_ledger); + bool ret = true; + QString desc; + ret &= getKeyPool(fingerprint, type, path, false, desc); + if(ret) descs.push_back(desc); + + if(!path.isEmpty()) + { + desc.clear(); + ret &= getKeyPool(fingerprint, type, path, true, desc); + if(ret) descs.push_back(desc); + } + + return ret; } -bool QtumHwiTool::getKeyPoolP2SH(const QString &fingerprint, QString &desc) +bool QtumHwiTool::getKeyPoolPKH(const QString &fingerprint, const QString& path, QStringList &descs) { - return getKeyPool(fingerprint, (int)OutputType::P2SH_SEGWIT, desc); + return getKeyPool(fingerprint, (int)OutputType::LEGACY, path, descs); } -bool QtumHwiTool::getKeyPoolBech32(const QString &fingerprint, QString &desc) +bool QtumHwiTool::getKeyPoolP2SH(const QString &fingerprint, const QString& path, QStringList &descs) { - return getKeyPool(fingerprint, (int)OutputType::BECH32, desc); + return getKeyPool(fingerprint, (int)OutputType::P2SH_SEGWIT, path, descs); +} + +bool QtumHwiTool::getKeyPoolBech32(const QString &fingerprint, const QString& path, QStringList &descs) +{ + return getKeyPool(fingerprint, (int)OutputType::BECH32, path, descs); } bool QtumHwiTool::signTx(const QString &fingerprint, QString &psbt) @@ -301,7 +320,7 @@ bool QtumHwiTool::rescanBlockchain(int startHeight, int stopHeight) return resStartHeight < resStopHeight; } -bool QtumHwiTool::importMulti(const QString &desc) +bool QtumHwiTool::importAddresses(const QString &desc) { if(!d->model) return false; @@ -328,6 +347,18 @@ bool QtumHwiTool::importMulti(const QString &desc) return countSuccess > 0; } +bool QtumHwiTool::importMulti(const QStringList &descs) +{ + bool ret = true; + for(QString desc : descs) + { + ret &= importAddresses(desc); + if(!ret) break; + } + + return ret; +} + bool QtumHwiTool::finalizePsbt(const QString &psbt, QString &hexTx, bool &complete) { if(!d->model) return false; diff --git a/src/qt/qtumhwitool.h b/src/qt/qtumhwitool.h index 178477c4c0..7cc27f0dbd 100644 --- a/src/qt/qtumhwitool.h +++ b/src/qt/qtumhwitool.h @@ -3,6 +3,7 @@ #include #include +#include #include #include class QtumHwiToolPriv; @@ -141,34 +142,50 @@ class QtumHwiTool : public QObject * @brief getKeyPool Get the key pool for a device * @param fingerprint Hardware wallet device fingerprint * @param type Type of output + * @param path The derivation path, if empty it is used the default + * @param internal Needed when the derivation path is specified, to determine if the address pool is for change addresses. + * If path is empty both internal and external addresses are loaded into the pool, so the parameter is not used. * @param desc Address descriptors * @return success of the operation */ - bool getKeyPool(const QString& fingerprint, int type, QString& desc); + bool getKeyPool(const QString& fingerprint, int type, const QString& path, bool internal, QString& desc); + + /** + * @brief getKeyPool Get the key pool for a device + * @param fingerprint Hardware wallet device fingerprint + * @param type Type of output + * @param path The derivation path, if empty it is used the default + * @param descs Address descriptors list + * @return success of the operation + */ + bool getKeyPool(const QString& fingerprint, int type, const QString& path, QStringList& descs); /** * @brief getKeyPoolPkh Get the PKH key pool for a device * @param fingerprint Hardware wallet device fingerprint - * @param desc Address descriptors + * @param path The derivation path, if empty it is used the default + * @param descs Address descriptors list * @return success of the operation */ - bool getKeyPoolPKH(const QString& fingerprint, QString& desc); + bool getKeyPoolPKH(const QString& fingerprint, const QString& path, QStringList& descs); /** * @brief getKeyPoolP2SH Get the P2SH key pool for a device * @param fingerprint Hardware wallet device fingerprint - * @param desc Address descriptors + * @param path The derivation path, if empty it is used the default + * @param descs Address descriptors list * @return success of the operation */ - bool getKeyPoolP2SH(const QString& fingerprint, QString& desc); + bool getKeyPoolP2SH(const QString& fingerprint, const QString& path, QStringList& descs); /** * @brief getKeyPoolBech32 Get the Bech32 key pool for a device * @param fingerprint Hardware wallet device fingerprint - * @param desc Address descriptors + * @param path The derivation path, if empty it is used the default + * @param descs Address descriptors list * @return success of the operation */ - bool getKeyPoolBech32(const QString& fingerprint, QString& desc); + bool getKeyPoolBech32(const QString& fingerprint, const QString& path, QStringList& descs); /** * @brief signTx Sign PSBT transaction @@ -205,11 +222,18 @@ class QtumHwiTool : public QObject bool rescanBlockchain(int startHeight =0, int stopHeight =-1); /** - * @brief importMulti Import address descriptions + * @brief importAddresses Import address descriptions + * @param desc Address descriptions + * @return success of the operation + */ + bool importAddresses(const QString& desc); + + /** + * @brief importMulti Import list of address descriptions * @param desc Address descriptions * @return success of the operation */ - bool importMulti(const QString& desc); + bool importMulti(const QStringList& descs); /** * @brief finalizePsbt Finalize psbt diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index a9dcf022fa..0f52cc5310 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -879,8 +879,8 @@ void WalletModel::checkHardwareWallet() QString errorMessage; if(importPKH) { - QString pkhdesc; - bool OK = hwiTool.getKeyPoolPKH(fingerprint, pkhdesc); + QStringList pkhdesc; + bool OK = hwiTool.getKeyPoolPKH(fingerprint, pathPKH, pkhdesc); if(OK) OK &= hwiTool.importMulti(pkhdesc); if(!OK) @@ -891,8 +891,8 @@ void WalletModel::checkHardwareWallet() if(importP2SH) { - QString p2shdesc; - bool OK = hwiTool.getKeyPoolP2SH(fingerprint, p2shdesc); + QStringList p2shdesc; + bool OK = hwiTool.getKeyPoolP2SH(fingerprint, pathP2SH, p2shdesc); if(OK) OK &= hwiTool.importMulti(p2shdesc); if(!OK) @@ -904,8 +904,8 @@ void WalletModel::checkHardwareWallet() if(importBech32) { - QString bech32desc; - bool OK = hwiTool.getKeyPoolBech32(fingerprint, bech32desc); + QStringList bech32desc; + bool OK = hwiTool.getKeyPoolBech32(fingerprint, pathBech32, bech32desc); if(OK) OK &= hwiTool.importMulti(bech32desc); if(!OK) @@ -919,7 +919,7 @@ void WalletModel::checkHardwareWallet() if(rescan) hwiTool.rescanBlockchain(); // Display error message if happen - if(errorMessage.isEmpty()) + if(!errorMessage.isEmpty()) { Q_EMIT message(tr("Import addresses"), errorMessage, CClientUIInterface::MSG_ERROR | CClientUIInterface::MSG_NOPREFIX); @@ -930,12 +930,15 @@ void WalletModel::checkHardwareWallet() } } -void WalletModel::importAddressesData(bool _rescan, bool _importPKH, bool _importP2SH, bool _importBech32) +void WalletModel::importAddressesData(bool _rescan, bool _importPKH, bool _importP2SH, bool _importBech32, QString _pathPKH, QString _pathP2SH, QString _pathBech32) { rescan = _rescan; importPKH = _importPKH; importP2SH = _importP2SH; importBech32 = _importBech32; + pathPKH = _pathPKH; + pathP2SH = _pathP2SH; + pathBech32 = _pathBech32; hardwareWalletInitRequired = true; } diff --git a/src/qt/walletmodel.h b/src/qt/walletmodel.h index e1a5edb3c4..3212236c4e 100644 --- a/src/qt/walletmodel.h +++ b/src/qt/walletmodel.h @@ -182,7 +182,7 @@ class WalletModel : public QObject void setFingerprint(const QString &value, bool stake = false); // Get or set hardware wallet init required (only for hardware wallet applicable) - void importAddressesData(bool rescan = true, bool importPKH = true, bool importP2SH = true, bool importBech32 = true); + void importAddressesData(bool rescan = true, bool importPKH = true, bool importP2SH = true, bool importBech32 = true, QString pathPKH = QString(), QString pathP2SH = QString(), QString pathBech32 = QString()); bool getSignPsbtWithHwiTool(); bool createUnsigned(); bool hasLedgerProblem(); @@ -236,6 +236,9 @@ class WalletModel : public QObject bool importPKH{true}; bool importP2SH{true}; bool importBech32{true}; + QString pathPKH; + QString pathP2SH; + QString pathBech32; QThread t; WalletWorker *worker; From 332a94dba5799580bed514a50c9408420f664a4d Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 29 Apr 2021 09:52:16 +0200 Subject: [PATCH 131/164] Add paths in the derivation path dialog --- src/qt/forms/derivationpathdialog.ui | 229 ++++++++++++++++++++------- 1 file changed, 176 insertions(+), 53 deletions(-) diff --git a/src/qt/forms/derivationpathdialog.ui b/src/qt/forms/derivationpathdialog.ui index 4643faf11c..622b567235 100644 --- a/src/qt/forms/derivationpathdialog.ui +++ b/src/qt/forms/derivationpathdialog.ui @@ -6,10 +6,16 @@ 0 0 - 501 - 338 + 574 + 507
+ + + 0 + 0 + + Select script type and derivation path @@ -49,48 +55,141 @@
+ + 0 + - - + + Choose the type of addresses in your wallet. - - - - - true - - - legacy (p2pkh) - - - true - - - - - - - p2sh-segwit (p2wpkh-p2sh) - - - true - - - - - - - native segwit (p2wpkh) - - - true - - - - + + + + 6 + + + 9 + + + 9 + + + 9 + + + 9 + + + + + true + + + legacy (p2pkh) + + + true + + + + + + + p2sh-segwit (p2wpkh-p2sh) + + + true + + + + + + + native segwit (p2wpkh) + + + true + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 10 + 10 + + + + + + + + You can override the suggested derivation path. +If you are not sure what this is, leave this field unchanged. + + + + + + + 9 + + + 9 + + + 9 + + + 9 + + + 6 + + + + + legacy + + + + + + + + + + p2sh-segwit + + + + + + + + + + native segwit + + + + + + + + @@ -108,24 +207,41 @@ - - + + Rescan the local blockchain for wallet related transactions. - - - - - rescan blockchain - - - true - - - - + + + + 6 + + + 9 + + + 9 + + + 9 + + + 9 + + + + + rescan blockchain + + + true + + + + + @@ -174,6 +290,13 @@ + + + QValidatedLineEdit + QLineEdit +
qt/qvalidatedlineedit.h
+
+
From 9eafb9c402c6226ff7da9cce4de568af167069ee Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 29 Apr 2021 11:12:55 +0200 Subject: [PATCH 132/164] Update derivation widgets --- src/qt/derivationpathdialog.cpp | 46 +++++++++++++++++++++++++++------ src/qt/derivationpathdialog.h | 7 ++++- 2 files changed, 44 insertions(+), 9 deletions(-) diff --git a/src/qt/derivationpathdialog.cpp b/src/qt/derivationpathdialog.cpp index e515a33600..5fcedc18c2 100644 --- a/src/qt/derivationpathdialog.cpp +++ b/src/qt/derivationpathdialog.cpp @@ -8,11 +8,15 @@ DerivationPathDialog::DerivationPathDialog(QWidget *parent) : ui->setupUi(this); // Connect signal and slots - QObject::connect(ui->cbRescan, SIGNAL(clicked()), this, SLOT(updateButtons())); - QObject::connect(ui->cbLegacy, SIGNAL(clicked()), this, SLOT(updateButtons())); - QObject::connect(ui->cbP2SH, SIGNAL(clicked()), this, SLOT(updateButtons())); - QObject::connect(ui->cbSegWit, SIGNAL(clicked()), this, SLOT(updateButtons())); - updateButtons(); + QObject::connect(ui->cbRescan, &QCheckBox::clicked, this, &DerivationPathDialog::updateWidgets); + QObject::connect(ui->cbLegacy, &QCheckBox::clicked, this, &DerivationPathDialog::updateWidgets); + QObject::connect(ui->cbP2SH, &QCheckBox::clicked, this, &DerivationPathDialog::updateWidgets); + QObject::connect(ui->cbSegWit, &QCheckBox::clicked, this, &DerivationPathDialog::updateWidgets); + QObject::connect(ui->txtLegacy, &QValidatedLineEdit::textChanged, this, &DerivationPathDialog::updateWidgets); + QObject::connect(ui->txtP2SH, &QValidatedLineEdit::textChanged, this, &DerivationPathDialog::updateWidgets); + QObject::connect(ui->txtSegWit, &QValidatedLineEdit::textChanged, this, &DerivationPathDialog::updateWidgets); + + updateWidgets(); } DerivationPathDialog::~DerivationPathDialog() @@ -39,8 +43,34 @@ bool DerivationPathDialog::importAddressesData(bool &rescan, bool &importPKH, bo return rescan || importPKH || importP2SH || importBech32; } -void DerivationPathDialog::updateButtons() +void DerivationPathDialog::updateWidgets() +{ + bool legacy = ui->cbLegacy->isChecked(); + bool p2sh = ui->cbP2SH->isChecked(); + bool segWit = ui->cbSegWit->isChecked(); + bool rescan = ui->cbRescan->isChecked(); + bool enabled = isDataValid() && isDataSelected(rescan, legacy, p2sh, segWit); + + widgetEnabled(ui->okButton, enabled); + widgetEnabled(ui->txtLegacy, legacy); + widgetEnabled(ui->txtP2SH, p2sh); + widgetEnabled(ui->txtSegWit, segWit); +} + +void DerivationPathDialog::widgetEnabled(QWidget *widget, bool enabled) +{ + if(widget && widget->isEnabled() != enabled) + { + widget->setEnabled(enabled); + } +} + +bool DerivationPathDialog::isDataValid() +{ + return true; +} + +bool DerivationPathDialog::isDataSelected(bool rescan, bool importPKH, bool importP2SH, bool importBech32) { - bool enabled = ui->cbRescan->isChecked() || ui->cbLegacy->isChecked() || ui->cbP2SH->isChecked() || ui->cbSegWit->isChecked(); - ui->okButton->setEnabled(enabled); + return rescan || importPKH || importP2SH || importBech32; } diff --git a/src/qt/derivationpathdialog.h b/src/qt/derivationpathdialog.h index e175914374..8af0128ff1 100644 --- a/src/qt/derivationpathdialog.h +++ b/src/qt/derivationpathdialog.h @@ -21,7 +21,12 @@ class DerivationPathDialog : public QDialog private Q_SLOTS: void on_cancelButton_clicked(); void on_okButton_clicked(); - void updateButtons(); + void updateWidgets(); + +private: + void widgetEnabled(QWidget *widget, bool enable); + bool isDataValid(); + bool isDataSelected(bool rescan, bool importPKH, bool importP2SH, bool importBech32); private: Ui::DerivationPathDialog *ui; From d1c675cfbe82cb9d53162c9c63571831dbf78acd Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 29 Apr 2021 12:46:56 +0200 Subject: [PATCH 133/164] Update import addresses --- src/qt/derivationpathdialog.cpp | 7 ++++-- src/qt/derivationpathdialog.h | 2 +- src/qt/hardwaresigntxdialog.cpp | 9 ++++---- src/qt/hardwaresigntxdialog.h | 2 +- src/qt/walletmodel.cpp | 38 ++++++++++++++++++++++----------- 5 files changed, 37 insertions(+), 21 deletions(-) diff --git a/src/qt/derivationpathdialog.cpp b/src/qt/derivationpathdialog.cpp index 5fcedc18c2..7b58aa4380 100644 --- a/src/qt/derivationpathdialog.cpp +++ b/src/qt/derivationpathdialog.cpp @@ -34,13 +34,16 @@ void DerivationPathDialog::on_okButton_clicked() QDialog::accept(); } -bool DerivationPathDialog::importAddressesData(bool &rescan, bool &importPKH, bool &importP2SH, bool &importBech32) +bool DerivationPathDialog::importAddressesData(bool &rescan, bool &importPKH, bool &importP2SH, bool &importBech32, QString& pathPKH, QString& pathP2SH, QString& pathBech32) { rescan = ui->cbRescan->isChecked(); importPKH = ui->cbLegacy->isChecked(); importP2SH = ui->cbP2SH->isChecked(); importBech32 = ui->cbSegWit->isChecked(); - return rescan || importPKH || importP2SH || importBech32; + pathPKH = ui->txtLegacy->text(); + pathP2SH = ui->txtP2SH->text(); + pathBech32 = ui->txtSegWit->text(); + return isDataValid() && isDataSelected(rescan, importPKH, importP2SH, importBech32); } void DerivationPathDialog::updateWidgets() diff --git a/src/qt/derivationpathdialog.h b/src/qt/derivationpathdialog.h index 8af0128ff1..f026f0749d 100644 --- a/src/qt/derivationpathdialog.h +++ b/src/qt/derivationpathdialog.h @@ -16,7 +16,7 @@ class DerivationPathDialog : public QDialog ~DerivationPathDialog(); - bool importAddressesData(bool& rescan, bool& importPKH, bool& importP2SH, bool& importBech32); + bool importAddressesData(bool& rescan, bool& importPKH, bool& importP2SH, bool& importBech32, QString& pathPKH, QString& pathP2SH, QString& pathBech32); private Q_SLOTS: void on_cancelButton_clicked(); diff --git a/src/qt/hardwaresigntxdialog.cpp b/src/qt/hardwaresigntxdialog.cpp index 74a630d9c5..04988d49ff 100644 --- a/src/qt/hardwaresigntxdialog.cpp +++ b/src/qt/hardwaresigntxdialog.cpp @@ -159,14 +159,15 @@ void HardwareSignTxDialog::on_importButton_clicked() { // Import addresses and rescan bool rescan, importPKH, importP2SH, importBech32; - if(importAddressesData(rescan, importPKH, importP2SH, importBech32)) + QString pathPKH, pathP2SH, pathBech32; + if(importAddressesData(rescan, importPKH, importP2SH, importBech32, pathPKH, pathP2SH, pathBech32)) { - d->model->importAddressesData(rescan, importPKH, importP2SH, importBech32); + d->model->importAddressesData(rescan, importPKH, importP2SH, importBech32, pathPKH, pathP2SH, pathBech32); QDialog::accept(); } } -bool HardwareSignTxDialog::importAddressesData(bool &rescan, bool &importPKH, bool &importP2SH, bool &importBech32) +bool HardwareSignTxDialog::importAddressesData(bool &rescan, bool &importPKH, bool &importP2SH, bool &importBech32, QString &pathPKH, QString &pathP2SH, QString &pathBech32) { // Init import addresses data bool ret = true; @@ -178,7 +179,7 @@ bool HardwareSignTxDialog::importAddressesData(bool &rescan, bool &importPKH, bo // Get list to import DerivationPathDialog dlg(this); ret &= dlg.exec() == QDialog::Accepted; - if(ret) ret &= dlg.importAddressesData(rescan, importPKH, importP2SH, importBech32); + if(ret) ret &= dlg.importAddressesData(rescan, importPKH, importP2SH, importBech32, pathPKH, pathP2SH, pathBech32); // Ask for device bool fDevice = importPKH || importP2SH || importBech32; diff --git a/src/qt/hardwaresigntxdialog.h b/src/qt/hardwaresigntxdialog.h index 2ad267e34b..f7b46becd5 100644 --- a/src/qt/hardwaresigntxdialog.h +++ b/src/qt/hardwaresigntxdialog.h @@ -28,7 +28,7 @@ private Q_SLOTS: private: bool askDevice(); - bool importAddressesData(bool& rescan, bool& importPKH, bool& importP2SH, bool& importBech32); + bool importAddressesData(bool& rescan, bool& importPKH, bool& importP2SH, bool& importBech32, QString& pathPKH, QString& pathP2SH, QString& pathBech32); private: Ui::HardwareSignTxDialog *ui; diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index 0f52cc5310..2cceb0179a 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -872,11 +872,12 @@ void WalletModel::checkHardwareWallet() // Init variables QtumHwiTool hwiTool(this); hwiTool.setModel(this); + QString errorMessage; + bool error = false; if(hwiTool.isConnected(fingerprint)) { // Setup key pool - QString errorMessage; if(importPKH) { QStringList pkhdesc; @@ -885,7 +886,8 @@ void WalletModel::checkHardwareWallet() if(!OK) { - errorMessage = tr("Import PKH failed: ") + hwiTool.errorMessage(); + error = true; + errorMessage = tr("Import PKH failed.\n") + hwiTool.errorMessage(); } } @@ -897,8 +899,9 @@ void WalletModel::checkHardwareWallet() if(!OK) { - errorMessage += "\n"; - errorMessage = tr("Import PKH failed: ") + hwiTool.errorMessage(); + error = true; + if(!errorMessage.isEmpty()) errorMessage += "\n\n"; + errorMessage += tr("Import P2SH failed.\n") + hwiTool.errorMessage(); } } @@ -910,20 +913,29 @@ void WalletModel::checkHardwareWallet() if(!OK) { - errorMessage += "\n"; - errorMessage = tr("Import Bech32 failed: ") + hwiTool.errorMessage(); + error = true; + if(!errorMessage.isEmpty()) errorMessage += "\n\n"; + errorMessage += tr("Import Bech32 failed.\n") + hwiTool.errorMessage(); } } // Rescan the chain - if(rescan) hwiTool.rescanBlockchain(); + if(rescan && !error) + hwiTool.rescanBlockchain(); + } + else + { + error = true; + errorMessage = tr("Ledger not connected."); + } - // Display error message if happen - if(!errorMessage.isEmpty()) - { - Q_EMIT message(tr("Import addresses"), errorMessage, - CClientUIInterface::MSG_ERROR | CClientUIInterface::MSG_NOPREFIX); - } + // Display error message if happen + if(error) + { + if(errorMessage.isEmpty()) + errorMessage = tr("unknown error"); + Q_EMIT message(tr("Import addresses"), errorMessage, + CClientUIInterface::MSG_ERROR | CClientUIInterface::MSG_NOPREFIX); } hardwareWalletInitRequired = false; From 63aff6dd50da8d7f8fea5fedc1f3e5facdbaf8ce Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 29 Apr 2021 14:48:37 +0200 Subject: [PATCH 134/164] Import address data when the HW creation finished --- src/qt/walletcontroller.cpp | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/qt/walletcontroller.cpp b/src/qt/walletcontroller.cpp index d4edc00aa4..bb6ad95ad2 100644 --- a/src/qt/walletcontroller.cpp +++ b/src/qt/walletcontroller.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -296,14 +297,34 @@ void CreateWalletActivity::finish() { if(m_wallet_model) { - m_wallet_model->setFingerprint(m_fingerprint); - m_wallet_model->importAddressesData(); + QTimer::singleShot(500, this, [this] { + // Set fingerprint + m_wallet_model->setFingerprint(m_fingerprint); + + // Init import addresses data + bool ret = true; + bool rescan = false; + bool importPKH = false; + bool importP2SH = false; + bool importBech32 = false; + QString pathPKH, pathP2SH, pathBech32; + + // Get list to import + DerivationPathDialog dlg(m_parent_widget); + ret &= dlg.exec() == QDialog::Accepted; + if(ret) ret &= dlg.importAddressesData(rescan, importPKH, importP2SH, importBech32, pathPKH, pathP2SH, pathBech32); + if(ret) m_wallet_model->importAddressesData(rescan, importPKH, importP2SH, importBech32, pathPKH, pathP2SH, pathBech32); + + Q_EMIT created(m_wallet_model); + Q_EMIT finished(); + }); } } - - if (m_wallet_model) Q_EMIT created(m_wallet_model); - - Q_EMIT finished(); + else + { + if (m_wallet_model) Q_EMIT created(m_wallet_model); + Q_EMIT finished(); + } } void CreateWalletActivity::create() From c6a935ba676df6e535489fce37838256314da3d1 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 29 Apr 2021 16:37:09 +0200 Subject: [PATCH 135/164] Add derivation path validators --- src/qt/derivationpathdialog.cpp | 39 +++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/src/qt/derivationpathdialog.cpp b/src/qt/derivationpathdialog.cpp index 7b58aa4380..7cbd9dfea1 100644 --- a/src/qt/derivationpathdialog.cpp +++ b/src/qt/derivationpathdialog.cpp @@ -1,5 +1,17 @@ #include #include +#include + +#define paternDerivationPath "^m/[0-9]{1,9}'/[0-9]{1,9}'/[0-9]{1,9}'$" +QString toHWIPath(const QString& path) +{ + if(path.isEmpty()) + return ""; + QString hwiPath = path; + hwiPath.replace("'", "h"); + hwiPath += "/1/*"; + return hwiPath; +} DerivationPathDialog::DerivationPathDialog(QWidget *parent) : QDialog(parent), @@ -16,6 +28,22 @@ DerivationPathDialog::DerivationPathDialog(QWidget *parent) : QObject::connect(ui->txtP2SH, &QValidatedLineEdit::textChanged, this, &DerivationPathDialog::updateWidgets); QObject::connect(ui->txtSegWit, &QValidatedLineEdit::textChanged, this, &DerivationPathDialog::updateWidgets); + // Set contract address validator + QRegularExpression regEx; + regEx.setPattern(paternDerivationPath); + + QRegularExpressionValidator *legacyValidator = new QRegularExpressionValidator(ui->txtLegacy); + legacyValidator->setRegularExpression(regEx); + ui->txtLegacy->setCheckValidator(legacyValidator); + + QRegularExpressionValidator *P2SHValidator = new QRegularExpressionValidator(ui->txtP2SH); + P2SHValidator->setRegularExpression(regEx); + ui->txtP2SH->setCheckValidator(P2SHValidator); + + QRegularExpressionValidator *segWitValidator = new QRegularExpressionValidator(ui->txtSegWit); + segWitValidator->setRegularExpression(regEx); + ui->txtSegWit->setCheckValidator(segWitValidator); + updateWidgets(); } @@ -40,9 +68,9 @@ bool DerivationPathDialog::importAddressesData(bool &rescan, bool &importPKH, bo importPKH = ui->cbLegacy->isChecked(); importP2SH = ui->cbP2SH->isChecked(); importBech32 = ui->cbSegWit->isChecked(); - pathPKH = ui->txtLegacy->text(); - pathP2SH = ui->txtP2SH->text(); - pathBech32 = ui->txtSegWit->text(); + pathPKH = toHWIPath(ui->txtLegacy->text()); + pathP2SH = toHWIPath(ui->txtP2SH->text()); + pathBech32 = toHWIPath(ui->txtSegWit->text()); return isDataValid() && isDataSelected(rescan, importPKH, importP2SH, importBech32); } @@ -70,7 +98,10 @@ void DerivationPathDialog::widgetEnabled(QWidget *widget, bool enabled) bool DerivationPathDialog::isDataValid() { - return true; + ui->txtLegacy->checkValidity(); + ui->txtP2SH->checkValidity(); + ui->txtSegWit->checkValidity(); + return ui->txtLegacy->isValid() && ui->txtP2SH->isValid() && ui->txtSegWit->isValid(); } bool DerivationPathDialog::isDataSelected(bool rescan, bool importPKH, bool importP2SH, bool importBech32) From 96c22a248f8f32fccbc693c02dd764608dc74bfa Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Tue, 4 May 2021 10:42:41 +0200 Subject: [PATCH 136/164] Update derivation path dialog for new hardware wallet --- src/qt/derivationpathdialog.cpp | 20 +++++++++++++++++--- src/qt/derivationpathdialog.h | 3 ++- src/qt/qtumhwitool.cpp | 22 ++++++++++++++++++++++ src/qt/qtumhwitool.h | 18 ++++++++++++++++++ src/qt/walletcontroller.cpp | 2 +- src/qtum/qtumledger.cpp | 6 +++--- 6 files changed, 63 insertions(+), 8 deletions(-) diff --git a/src/qt/derivationpathdialog.cpp b/src/qt/derivationpathdialog.cpp index 7cbd9dfea1..0d7cec86df 100644 --- a/src/qt/derivationpathdialog.cpp +++ b/src/qt/derivationpathdialog.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #define paternDerivationPath "^m/[0-9]{1,9}'/[0-9]{1,9}'/[0-9]{1,9}'$" @@ -9,12 +10,12 @@ QString toHWIPath(const QString& path) return ""; QString hwiPath = path; hwiPath.replace("'", "h"); - hwiPath += "/1/*"; return hwiPath; } -DerivationPathDialog::DerivationPathDialog(QWidget *parent) : +DerivationPathDialog::DerivationPathDialog(QWidget *parent, bool _create) : QDialog(parent), + create(_create), ui(new Ui::DerivationPathDialog) { ui->setupUi(this); @@ -35,14 +36,25 @@ DerivationPathDialog::DerivationPathDialog(QWidget *parent) : QRegularExpressionValidator *legacyValidator = new QRegularExpressionValidator(ui->txtLegacy); legacyValidator->setRegularExpression(regEx); ui->txtLegacy->setCheckValidator(legacyValidator); + ui->txtLegacy->setText(QtumHwiTool::derivationPathPKH()); + ui->txtLegacy->setPlaceholderText(QtumHwiTool::derivationPathPKH()); QRegularExpressionValidator *P2SHValidator = new QRegularExpressionValidator(ui->txtP2SH); P2SHValidator->setRegularExpression(regEx); ui->txtP2SH->setCheckValidator(P2SHValidator); + ui->txtP2SH->setText(QtumHwiTool::derivationPathP2SH()); + ui->txtP2SH->setPlaceholderText(QtumHwiTool::derivationPathP2SH()); QRegularExpressionValidator *segWitValidator = new QRegularExpressionValidator(ui->txtSegWit); segWitValidator->setRegularExpression(regEx); ui->txtSegWit->setCheckValidator(segWitValidator); + ui->txtSegWit->setText(QtumHwiTool::derivationPathBech32()); + ui->txtSegWit->setPlaceholderText(QtumHwiTool::derivationPathBech32()); + + if(create) + { + ui->cbRescan->setEnabled(false); + } updateWidgets(); } @@ -106,5 +118,7 @@ bool DerivationPathDialog::isDataValid() bool DerivationPathDialog::isDataSelected(bool rescan, bool importPKH, bool importP2SH, bool importBech32) { - return rescan || importPKH || importP2SH || importBech32; + bool hasDerivation = importPKH || importP2SH || importBech32; + if(create) return hasDerivation; + return rescan || hasDerivation; } diff --git a/src/qt/derivationpathdialog.h b/src/qt/derivationpathdialog.h index f026f0749d..48af7297e9 100644 --- a/src/qt/derivationpathdialog.h +++ b/src/qt/derivationpathdialog.h @@ -12,7 +12,7 @@ class DerivationPathDialog : public QDialog Q_OBJECT public: - explicit DerivationPathDialog(QWidget *parent = nullptr); + explicit DerivationPathDialog(QWidget *parent = nullptr, bool create = false); ~DerivationPathDialog(); @@ -29,6 +29,7 @@ private Q_SLOTS: bool isDataSelected(bool rescan, bool importPKH, bool importP2SH, bool importBech32); private: + bool create; Ui::DerivationPathDialog *ui; }; diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 319ba22dac..4190ea0591 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -146,6 +146,10 @@ bool QtumHwiTool::getKeyPool(const QString &fingerprint, int type, const QString std::string strFingerprint = fingerprint.toStdString(); std::string strDesc = desc.toStdString(); std::string strPath = path.toStdString(); + if(!strPath.empty()) + { + strPath += internal ? "/1/*" : "/0/*"; + } bool ret = QtumLedger::instance().getKeyPool(strFingerprint, type, strPath, internal, strDesc); desc = QString::fromStdString(strDesc); if(ret) @@ -602,3 +606,21 @@ bool QtumHwiTool::removeApp(InstallDevice::DeviceType type) return ret; } + +QString QtumHwiTool::derivationPathPKH() +{ + std::string path = QtumLedger::derivationPath((int)OutputType::LEGACY); + return QString::fromStdString(path); +} + +QString QtumHwiTool::derivationPathP2SH() +{ + std::string path = QtumLedger::derivationPath((int)OutputType::P2SH_SEGWIT); + return QString::fromStdString(path); +} + +QString QtumHwiTool::derivationPathBech32() +{ + std::string path = QtumLedger::derivationPath((int)OutputType::BECH32); + return QString::fromStdString(path); +} diff --git a/src/qt/qtumhwitool.h b/src/qt/qtumhwitool.h index 7cc27f0dbd..db250a8565 100644 --- a/src/qt/qtumhwitool.h +++ b/src/qt/qtumhwitool.h @@ -286,6 +286,24 @@ class QtumHwiTool : public QObject */ void setModel(WalletModel *model); + /** + * @brief derivationPathPKH Get default derivation path for PKH output + * @return Derivation path + */ + static QString derivationPathPKH(); + + /** + * @brief derivationPathP2SH Get default derivation path for P2SH output + * @return Derivation path + */ + static QString derivationPathP2SH(); + + /** + * @brief derivationPathBech32 Get default derivation path for Bech32 output + * @return Derivation path + */ + static QString derivationPathBech32(); + Q_SIGNALS: public Q_SLOTS: diff --git a/src/qt/walletcontroller.cpp b/src/qt/walletcontroller.cpp index bb6ad95ad2..76e74a73bc 100644 --- a/src/qt/walletcontroller.cpp +++ b/src/qt/walletcontroller.cpp @@ -310,7 +310,7 @@ void CreateWalletActivity::finish() QString pathPKH, pathP2SH, pathBech32; // Get list to import - DerivationPathDialog dlg(m_parent_widget); + DerivationPathDialog dlg(m_parent_widget, true); ret &= dlg.exec() == QDialog::Accepted; if(ret) ret &= dlg.importAddressesData(rescan, importPKH, importP2SH, importBech32, pathPKH, pathP2SH, pathBech32); if(ret) m_wallet_model->importAddressesData(rescan, importPKH, importP2SH, importBech32, pathPKH, pathP2SH, pathBech32); diff --git a/src/qtum/qtumledger.cpp b/src/qtum/qtumledger.cpp index 5ae3be44a1..e70a37a45b 100644 --- a/src/qtum/qtumledger.cpp +++ b/src/qtum/qtumledger.cpp @@ -589,13 +589,13 @@ std::string QtumLedger::derivationPath(int type) std::string derivPath; switch (type) { case (int)OutputType::P2SH_SEGWIT: - derivPath = "m/49h/88h/0h/1/*"; + derivPath = "m/49'/88'/0'"; break; case (int)OutputType::BECH32: - derivPath = "m/84h/88h/0h/1/*"; + derivPath = "m/84'/88'/0'"; break; case (int)OutputType::LEGACY: - derivPath = "m/44h/88h/0h/1/*"; + derivPath = "m/44'/88'/0'"; break; default: break; From c45b6ee4f926973eb971bf4ebb2cb4cb8f5d7d34 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Tue, 4 May 2021 16:42:21 +0200 Subject: [PATCH 137/164] Check the default output type in the hw derivation dialog --- src/qt/derivationpathdialog.cpp | 21 ++++++++++++++++++++- src/qt/derivationpathdialog.h | 3 ++- src/qt/forms/derivationpathdialog.ui | 6 +++--- src/qt/hardwaresigntxdialog.cpp | 2 +- src/qt/walletcontroller.cpp | 2 +- 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/qt/derivationpathdialog.cpp b/src/qt/derivationpathdialog.cpp index 0d7cec86df..10561b74cc 100644 --- a/src/qt/derivationpathdialog.cpp +++ b/src/qt/derivationpathdialog.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #define paternDerivationPath "^m/[0-9]{1,9}'/[0-9]{1,9}'/[0-9]{1,9}'$" @@ -13,7 +14,7 @@ QString toHWIPath(const QString& path) return hwiPath; } -DerivationPathDialog::DerivationPathDialog(QWidget *parent, bool _create) : +DerivationPathDialog::DerivationPathDialog(QWidget *parent, WalletModel* model, bool _create) : QDialog(parent), create(_create), ui(new Ui::DerivationPathDialog) @@ -56,6 +57,24 @@ DerivationPathDialog::DerivationPathDialog(QWidget *parent, bool _create) : ui->cbRescan->setEnabled(false); } + if(model) + { + OutputType type = model->wallet().getDefaultAddressType(); + switch (type) { + case OutputType::LEGACY: + ui->cbLegacy->setChecked(true); + break; + case OutputType::P2SH_SEGWIT: + ui->cbP2SH->setChecked(true); + break; + case OutputType::BECH32: + ui->cbSegWit->setChecked(true); + break; + default: + break; + } + } + updateWidgets(); } diff --git a/src/qt/derivationpathdialog.h b/src/qt/derivationpathdialog.h index 48af7297e9..442a396788 100644 --- a/src/qt/derivationpathdialog.h +++ b/src/qt/derivationpathdialog.h @@ -2,6 +2,7 @@ #define DERIVATIONPATHDIALOG_H #include +#include namespace Ui { class DerivationPathDialog; @@ -12,7 +13,7 @@ class DerivationPathDialog : public QDialog Q_OBJECT public: - explicit DerivationPathDialog(QWidget *parent = nullptr, bool create = false); + explicit DerivationPathDialog(QWidget *parent, WalletModel* model, bool create = false); ~DerivationPathDialog(); diff --git a/src/qt/forms/derivationpathdialog.ui b/src/qt/forms/derivationpathdialog.ui index 622b567235..69b7ecaa03 100644 --- a/src/qt/forms/derivationpathdialog.ui +++ b/src/qt/forms/derivationpathdialog.ui @@ -91,7 +91,7 @@ legacy (p2pkh) - true + false @@ -101,7 +101,7 @@ p2sh-segwit (p2wpkh-p2sh) - true + false @@ -111,7 +111,7 @@ native segwit (p2wpkh) - true + false diff --git a/src/qt/hardwaresigntxdialog.cpp b/src/qt/hardwaresigntxdialog.cpp index 04988d49ff..9fe7935721 100644 --- a/src/qt/hardwaresigntxdialog.cpp +++ b/src/qt/hardwaresigntxdialog.cpp @@ -177,7 +177,7 @@ bool HardwareSignTxDialog::importAddressesData(bool &rescan, bool &importPKH, bo importBech32 = false; // Get list to import - DerivationPathDialog dlg(this); + DerivationPathDialog dlg(this, d->model); ret &= dlg.exec() == QDialog::Accepted; if(ret) ret &= dlg.importAddressesData(rescan, importPKH, importP2SH, importBech32, pathPKH, pathP2SH, pathBech32); diff --git a/src/qt/walletcontroller.cpp b/src/qt/walletcontroller.cpp index 76e74a73bc..2f4d0080e8 100644 --- a/src/qt/walletcontroller.cpp +++ b/src/qt/walletcontroller.cpp @@ -310,7 +310,7 @@ void CreateWalletActivity::finish() QString pathPKH, pathP2SH, pathBech32; // Get list to import - DerivationPathDialog dlg(m_parent_widget, true); + DerivationPathDialog dlg(m_parent_widget, m_wallet_model, true); ret &= dlg.exec() == QDialog::Accepted; if(ret) ret &= dlg.importAddressesData(rescan, importPKH, importP2SH, importBech32, pathPKH, pathP2SH, pathBech32); if(ret) m_wallet_model->importAddressesData(rescan, importPKH, importP2SH, importBech32, pathPKH, pathP2SH, pathBech32); From 0190bee686168b908d674062e70dc9f0089db791 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Wed, 5 May 2021 09:35:48 +0200 Subject: [PATCH 138/164] Add from and to parameters for get key pool --- src/qt/qtumhwitool.cpp | 6 +++++- src/qtum/qtumledger.cpp | 12 ++++++------ src/qtum/qtumledger.h | 8 +++++--- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 4190ea0591..92f679d216 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -33,6 +33,8 @@ static const QString PARAM_SHOWCONTRACTDATA = "showcontractdata"; static const QString LOAD_FORMAT = ":/ledger/%1_load"; static const QString DELETE_FORMAT = ":/ledger/%1_delete"; static const QString RC_PATH_FORMAT = ":/ledger"; +static const int ADDRESS_FROM = 0; +static const int ADDRESS_TO = 1000; class QtumHwiToolPriv { @@ -55,6 +57,8 @@ class QtumHwiToolPriv QProcess process; QString strStdout; QString strError; + int from = ADDRESS_FROM; + int to = ADDRESS_TO; ExecRPCCommand* cmdRescan = 0; ExecRPCCommand* cmdImport = 0; @@ -150,7 +154,7 @@ bool QtumHwiTool::getKeyPool(const QString &fingerprint, int type, const QString { strPath += internal ? "/1/*" : "/0/*"; } - bool ret = QtumLedger::instance().getKeyPool(strFingerprint, type, strPath, internal, strDesc); + bool ret = QtumLedger::instance().getKeyPool(strFingerprint, type, strPath, internal, d->from, d->to, strDesc); desc = QString::fromStdString(strDesc); if(ret) { diff --git a/src/qtum/qtumledger.cpp b/src/qtum/qtumledger.cpp index e70a37a45b..69a78346a2 100644 --- a/src/qtum/qtumledger.cpp +++ b/src/qtum/qtumledger.cpp @@ -362,7 +362,7 @@ bool QtumLedger::signMessage(const std::string &fingerprint, const std::string & return endSignMessage(fingerprint, message, path, signature); } -bool QtumLedger::getKeyPool(const std::string &fingerprint, int type, const std::string& path, bool internal, std::string &desc) +bool QtumLedger::getKeyPool(const std::string &fingerprint, int type, const std::string& path, bool internal, int from, int to, std::string &desc) { LOCK(cs_ledger); // Check if tool exists @@ -373,12 +373,12 @@ bool QtumLedger::getKeyPool(const std::string &fingerprint, int type, const std: if(isStarted()) return false; - if(!beginGetKeyPool(fingerprint, type, path, internal, desc)) + if(!beginGetKeyPool(fingerprint, type, path, internal, from, to, desc)) return false; wait(); - return endGetKeyPool(fingerprint, type, path, internal, desc); + return endGetKeyPool(fingerprint, type, path, internal, from, to, desc); } std::string QtumLedger::errorMessage() @@ -540,7 +540,7 @@ bool QtumLedger::endSignMessage(const std::string &, const std::string &, const return false; } -bool QtumLedger::beginGetKeyPool(const std::string &fingerprint, int type, const std::string& path, bool internal, std::string &) +bool QtumLedger::beginGetKeyPool(const std::string &fingerprint, int type, const std::string& path, bool internal, int from, int to, std::string &) { // Get the output type std::string descType; @@ -568,14 +568,14 @@ bool QtumLedger::beginGetKeyPool(const std::string &fingerprint, int type, const arguments << "--internal"; } } - arguments << "0" << "1000"; + arguments << std::to_string(from) << std::to_string(to); d->process.start(d->toolPath, arguments); d->fStarted = true; return d->fStarted; } -bool QtumLedger::endGetKeyPool(const std::string &, int, const std::string& , bool, std::string &desc) +bool QtumLedger::endGetKeyPool(const std::string &, int, const std::string& , bool, int, int, std::string &desc) { // Decode command line results bool ret = d->strStdout.find("desc")!=std::string::npos; diff --git a/src/qtum/qtumledger.h b/src/qtum/qtumledger.h index 98a3a85b21..657e8f5d2a 100644 --- a/src/qtum/qtumledger.h +++ b/src/qtum/qtumledger.h @@ -94,10 +94,12 @@ class QtumLedger { * @param path The derivation path, if empty it is used the default * @param internal Needed when the derivation path is specified, to determine if the address pool is for change addresses. * If path is empty both internal and external addresses are loaded into the pool, so the parameter is not used. + * @param from Address list start + * @param to Address list end * @param desc Address descriptors * @return success of the operation */ - bool getKeyPool(const std::string& fingerprint, int type, const std::string& path, bool internal, std::string& desc); + bool getKeyPool(const std::string& fingerprint, int type, const std::string& path, bool internal, int from, int to, std::string& desc); /** * @brief errorMessage Get the last error message @@ -140,8 +142,8 @@ class QtumLedger { bool beginSignMessage(const std::string& fingerprint, const std::string& message, const std::string& path, std::string &signature); bool endSignMessage(const std::string& fingerprint, const std::string& message, const std::string& path, std::string &signature); - bool beginGetKeyPool(const std::string& fingerprint, int type, const std::string& path, bool internal, std::string& desc); - bool endGetKeyPool(const std::string& fingerprint, int type, const std::string& path, bool internal, std::string& desc); + bool beginGetKeyPool(const std::string& fingerprint, int type, const std::string& path, bool internal, int from, int to, std::string& desc); + bool endGetKeyPool(const std::string& fingerprint, int type, const std::string& path, bool internal, int from, int to, std::string& desc); private: QtumLedger(const QtumLedger&); From 436421fdd60e5a4711df1c1416a9884e0639933b Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Wed, 5 May 2021 13:02:03 +0200 Subject: [PATCH 139/164] Always select the default output type in hw --- src/qt/derivationpathdialog.cpp | 9 +++++---- src/qt/forms/derivationpathdialog.ui | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/qt/derivationpathdialog.cpp b/src/qt/derivationpathdialog.cpp index 10561b74cc..e4835b3be0 100644 --- a/src/qt/derivationpathdialog.cpp +++ b/src/qt/derivationpathdialog.cpp @@ -52,23 +52,24 @@ DerivationPathDialog::DerivationPathDialog(QWidget *parent, WalletModel* model, ui->txtSegWit->setText(QtumHwiTool::derivationPathBech32()); ui->txtSegWit->setPlaceholderText(QtumHwiTool::derivationPathBech32()); - if(create) + if(model && create) { + ui->cbRescan->setChecked(true); ui->cbRescan->setEnabled(false); - } - if(model) - { OutputType type = model->wallet().getDefaultAddressType(); switch (type) { case OutputType::LEGACY: ui->cbLegacy->setChecked(true); + ui->cbLegacy->setEnabled(false); break; case OutputType::P2SH_SEGWIT: ui->cbP2SH->setChecked(true); + ui->cbP2SH->setEnabled(false); break; case OutputType::BECH32: ui->cbSegWit->setChecked(true); + ui->cbSegWit->setEnabled(false); break; default: break; diff --git a/src/qt/forms/derivationpathdialog.ui b/src/qt/forms/derivationpathdialog.ui index 69b7ecaa03..b1f091ff26 100644 --- a/src/qt/forms/derivationpathdialog.ui +++ b/src/qt/forms/derivationpathdialog.ui @@ -236,7 +236,7 @@ If you are not sure what this is, leave this field unchanged.
rescan blockchain - true + false From 9bd3d3ae7c82504669012ac963173cca404e4ecf Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Tue, 27 Apr 2021 10:22:44 +0200 Subject: [PATCH 140/164] Update install device to take into account the network type --- src/Makefile.qt.include | 8 +++++++- src/qt/bitcoin.qrc | 6 ++++++ src/qt/qtumhwitool.cpp | 5 +++-- src/qt/res/ledger/nanos_stake_test_app.hex | 0 src/qt/res/ledger/nanos_stake_test_delete.txt | 0 src/qt/res/ledger/nanos_stake_test_load.txt | 0 src/qt/res/ledger/nanos_test_app.hex | 0 src/qt/res/ledger/nanos_test_delete.txt | 0 src/qt/res/ledger/nanos_test_load.txt | 0 9 files changed, 16 insertions(+), 3 deletions(-) create mode 100755 src/qt/res/ledger/nanos_stake_test_app.hex create mode 100644 src/qt/res/ledger/nanos_stake_test_delete.txt create mode 100644 src/qt/res/ledger/nanos_stake_test_load.txt create mode 100644 src/qt/res/ledger/nanos_test_app.hex create mode 100644 src/qt/res/ledger/nanos_test_delete.txt create mode 100644 src/qt/res/ledger/nanos_test_load.txt diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index 25e2f7343e..fe4872df94 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -648,7 +648,13 @@ qt/res/ledger/nanos_load.txt \ qt/res/ledger/nanos_delete.txt \ qt/res/ledger/nanos_stake_app.hex \ qt/res/ledger/nanos_stake_load.txt \ -qt/res/ledger/nanos_stake_delete.txt +qt/res/ledger/nanos_stake_delete.txt \ +qt/res/ledger/nanos_test_app.hex \ +qt/res/ledger/nanos_test_load.txt \ +qt/res/ledger/nanos_test_delete.txt \ +qt/res/ledger/nanos_stake_test_app.hex \ +qt/res/ledger/nanos_stake_test_load.txt \ +qt/res/ledger/nanos_stake_test_delete.txt BITCOIN_RC = qt/res/bitcoin-qt-res.rc diff --git a/src/qt/bitcoin.qrc b/src/qt/bitcoin.qrc index 3d5e5e162b..480db9ca59 100644 --- a/src/qt/bitcoin.qrc +++ b/src/qt/bitcoin.qrc @@ -247,5 +247,11 @@ res/ledger/nanos_stake_app.hex res/ledger/nanos_stake_load.txt res/ledger/nanos_stake_delete.txt + res/ledger/nanos_test_app.hex + res/ledger/nanos_test_load.txt + res/ledger/nanos_test_delete.txt + res/ledger/nanos_stake_test_app.hex + res/ledger/nanos_stake_test_load.txt + res/ledger/nanos_stake_test_delete.txt diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 92f679d216..3cf49464a6 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -488,11 +488,12 @@ InstallDevice::~InstallDevice() QString InstallDevice::deviceToString(InstallDevice::DeviceType type) { + bool mainnet = gArgs.GetChainName() == CBaseChainParams::MAIN; switch (type) { case InstallDevice::WalletNanoS: - return "nanos"; + return mainnet ? "nanos" : "nanos_test"; case InstallDevice::StakeNanoS: - return "nanos_stake"; + return mainnet ? "nanos_stake" : "nanos_stake_test"; default: break; } diff --git a/src/qt/res/ledger/nanos_stake_test_app.hex b/src/qt/res/ledger/nanos_stake_test_app.hex new file mode 100755 index 0000000000..e69de29bb2 diff --git a/src/qt/res/ledger/nanos_stake_test_delete.txt b/src/qt/res/ledger/nanos_stake_test_delete.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/qt/res/ledger/nanos_stake_test_load.txt b/src/qt/res/ledger/nanos_stake_test_load.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/qt/res/ledger/nanos_test_app.hex b/src/qt/res/ledger/nanos_test_app.hex new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/qt/res/ledger/nanos_test_delete.txt b/src/qt/res/ledger/nanos_test_delete.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/qt/res/ledger/nanos_test_load.txt b/src/qt/res/ledger/nanos_test_load.txt new file mode 100644 index 0000000000..e69de29bb2 From d97a85b300e6805d2f8b2c6907f4d0bd14eeabe7 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Tue, 27 Apr 2021 14:04:15 +0200 Subject: [PATCH 141/164] Add commands to install qtum ledger test app --- src/qt/res/ledger/nanos_stake_test_app.hex | 2531 ++++++++++++++++ src/qt/res/ledger/nanos_stake_test_delete.txt | 1 + src/qt/res/ledger/nanos_stake_test_load.txt | 1 + src/qt/res/ledger/nanos_test_app.hex | 2655 +++++++++++++++++ src/qt/res/ledger/nanos_test_delete.txt | 1 + src/qt/res/ledger/nanos_test_load.txt | 1 + 6 files changed, 5190 insertions(+) diff --git a/src/qt/res/ledger/nanos_stake_test_app.hex b/src/qt/res/ledger/nanos_stake_test_app.hex index e69de29bb2..9ff678624c 100755 --- a/src/qt/res/ledger/nanos_stake_test_app.hex +++ b/src/qt/res/ledger/nanos_stake_test_app.hex @@ -0,0 +1,2531 @@ +:02000004C0D06A +:1000000010B5044662B604F0CDFD002C0DD00120E1 +:1000100000022168814205D1606801280AD1A068E8 +:10002000002803D104F08EFC02E0002004F0AEFCB6 +:10003000002010BD204604F02BFDF0B581B0044631 +:100040000020002A1CD00B780A2B19D89D0001260D +:100050003543954214D82370002B10D00096271DED +:100060004D1C002601210022284602F03BFA01C760 +:100070002D1D761C20788642F4D3009800E030468F +:1000800001B0F0BDF0B58DB04A484B4C0027275267 +:100090004120C0000090275401AE304608F08EFD8C +:1000A0000546B585A8B2002812D0102877D001A83F +:1000B00087850B9805F06EFF02203E49605240484C +:1000C0006F21017045700121204602F0CBFD58E000 +:1000D00001A805F05FFF0B90208802F0CAFD207890 +:1000E000002802D03548334D2FE0354A5078137838 +:1000F0000021364D7D44364E7E446F5CBB4202D1BA +:10010000775CB8420AD0491C0D29F6D36D20000255 +:10011000CBB20D210D2B274D01D116E0254D2D48D9 +:100120007844405C002809D08120830067200002C9 +:100130001279002A09D0E25A052A06D088002649F9 +:100140007944085805F06CFC80471E49605225210F +:100150004901615C00290CD0009BE15CEF220A4060 +:10016000E25409210903884203D05D21164A012384 +:100170005354615B020A124B5A545A185070881C2F +:10018000605305F0FBFE01A9884202D10B9805F0EF +:1001900001FF01A8808D002809D10DB0F0BD01A894 +:1001A00087850B9805F0F6FE102004F035FD04F06D +:1001B00033FDC046060200007C180020AA6F000034 +:1001C000E81F00200A020000001800200A8D00002D +:1001D000138D0000F88C0000E88C0000F0B581B0B1 +:1001E00018480024FF22214604F0F7FC412000902B +:1001F000C600154FBC5515483C525D241448015D9E +:10020000B85D252255017A5D002A06D0002904D068 +:10021000202108430099C90078540C49795A04F008 +:1002200045FF812189007852785D002806D0084872 +:10023000005D002802D0002005F06CFEFFF722FFD1 +:10024000DBE7C046E81F00207C1800200602000003 +:1002500000180020F0B581B0304C7C44204605F0F9 +:10026000DFFB808802F005FD204605F0D9FB808881 +:10027000C0B2254CFF2843D02948784405F0D0FB74 +:100280008088FF2108423BD0204804680546A088AA +:100290001F4F7870000A3870E088F870000AB87054 +:1002A000207A38710934204608F0AAFC02467A7197 +:1002B000B81D214604F07BFC2C682046093008F06C +:1002C0009FFC0546AE1D2734204608F099FCF1B28C +:1002D0007854EE1DF0B23D18204608F091FC02461D +:1002E0002846214604F063FC08480068273008F0DF +:1002F00087FC8019C0B20749074A505209200403FD +:10030000204601B0F0BDC04685690000201D0020D8 +:10031000E81F0020060200007C180020629B0000FD +:10032000429B000010B51148784405F079FB8079B4 +:100330000B490C4A082353520B4930224A700122C0 +:100340008A700523CB7003230B714A7100248C71D2 +:10035000CB7110401B2242400A700920000310BDDF +:10036000060200007C180020E81F0020949A00007C +:10037000B0B51A4C7C44204605F052FB808802F050 +:1003800078FC204605F04CFB8088C0B20F4CFF285B +:1003900019D01348784405F043FB8088FF210842B8 +:1003A00011D06B2004020A4DA87800280BD10D480B +:1003B000784405F035FB80880649074A01235352EB +:1003C0002870092004032046B0BDC046856900009E +:1003D000E81F0020060200007C180020489A000058 +:1003E000289A00000C9A000010B50720C0430A4963 +:1003F0000979002900D00846C4B267200002F82C11 +:1004000008D80548214605F079FC044804490C52F7 +:100410000920000310BDC046E81F002006020000AE +:100420007C180020F0B585B0524E3779564D7D448A +:10043000284605F0F5FA808802F01BFC284605F0F6 +:10044000EFFA8088C0B24C4C042800D98CE001251A +:10045000294681401620014200D185E00497B178F9 +:100460006B200702002080291ED000297FD1701D3B +:1004700000262946324602F035F86A023F49885084 +:100480007F2080000E5428020D543D20C0000E54E1 +:100490003B480E547B2080000E541F2000010E505C +:1004A0000E75CE77334E0420F178002935465ED1A3 +:1004B0000499091A7D229200304FB9542818401D22 +:1004C0003F21C90078500126304602F097FC0920F0 +:1004D0000203387D082849D100233B757F20800026 +:1004E0003946385CFB340028274640D02024684633 +:1004F0001F462B463033029318C008462830314639 +:1005000004923A463B4605F007FC08210391284631 +:1005100005F0F4FB322028706F702A1D029F3846C8 +:100520002146234605F024FC7002144E315828461B +:10053000243002F0B4F92846283031461531039AA8 +:1005400004F035FB1148784405F06AFA69460F60FB +:100550004C600830302321462A4605F019FC094832 +:1005600038213152049F02E0274600E01746B8B216 +:1005700005B0F0BDE81F0020856900007C18002050 +:100580008E040000060200008E990000769800009C +:10059000F0B59FB014460E4602AD69460D600121CC +:1005A00015AF1A463B4602F0FAF908354127002EEE +:1005B00003D1284601F056FD212741222046294635 +:1005C00004F0F5FA38461FB0F0BD0000F0B59DB05C +:1005D000C44E7E44304605F023FA8579BB4CA078A2 +:1005E0000D90304605F01CFA2927C05D01263540E4 +:1005F0000B95002500282A460AD0A07802282A4612 +:1006000006D1B348817901220020072900D0024693 +:100610000C92B548784405F003FAC05D0D9B012BA0 +:1006200029460DD00C990029294609D100282946D0 +:1006300006D0A74881790020072900D00646314618 +:100640000A910127012B384600D12846252149016E +:10065000A04A515CA04EFE36E278002903D0002863 +:1006600001D135462FE16B200502A078022800D980 +:1006700029E1022A11D3032A08D0022A00D022E15C +:1006800096480068406B002807D11CE19348006839 +:100690004021405C022800D015E167200502207946 +:1006A000002800D10FE1012B099202D1601D04F056 +:1006B000EBF808900C98002809D060798000801D24 +:1006C000C0B220180121002201F00CFF1C90874DC0 +:1006D0007D44284605F0A4F9808802F0CAFA28462D +:1006E00005F09EF97C49CD1C8088C0B2042800D951 +:1006F000E9E0012181401620014200D1E3E005F04C +:10070000CDFBAA28744D00D0DDE0651D2846394692 +:1007100002F0DEF90790412006902070671C14ABB0 +:1007200028460B993A46FFF733FF099B0546012BF4 +:1007300014D0032B10D1E9B20EAD38462A4602F090 +:10074000B6F800206946086022464332142132235D +:10075000284603F079F843E0022B34D10EA8142187 +:1007600004914170002105910170E9B2821C384664 +:100770001F46039202F09BF858480068022F17D1D9 +:10078000049F406B00282CD005F04AF901466846CA +:1007900007602746433700223846039B05F008FAD6 +:1007A0000546E8B201281CD1384608F029FA17E0BE +:1007B000C0886946086005984860224643320EA802 +:1007C000162196230AE045480068808800216A4681 +:1007D00003C2E9B2224643329623384602F096F825 +:1007E0000546422025540B98002801D10420607052 +:1007F000EFB2E5192846433014A9202204F0D7F9B6 +:10080000384663303649334B58520D98012830D062 +:10081000079800282DD00C98002847D02425585D33 +:10082000002808D0194620311CA8042204F0DEF963 +:10083000284B00283AD000265E55184620301CA9C7 +:1008400004221F4604F0B3F91C9B2046C83009253A +:10085000274A7A44294604F00FFFD02026540698F0 +:10086000C000395C10220A433A5404F02DF82D03DD +:1008700029E00D95322F354625D82046C83043341F +:1008800021463A461C4604F092F9C82000210D9AF0 +:1008900011540698C000215C10220A432254089883 +:1008A000C0B203F0FFFF092005030CE00920050397 +:1008B0000A98002807D00698C000195C10220A4345 +:1008C0001A5404F00BF8A8B21DB0F0BDE81F0020C8 +:1008D0003C2100207C18002082690000201D00209F +:1008E00006020000EA970000A8970000EC960000BE +:1008F000FA840000B0B5692300218522002807D0C2 +:100900000C480D49085A0D4941180B32002001E0EE +:1009100010461A468BB20A4CE2548A1C054B064D0F +:10092000EA52491C89B2605491B2202004F0BEFB07 +:10093000B0BDC046060200007C180020FEFF00008B +:10094000E81F0020F0B593B00920C701C24D002672 +:10095000EE51C24C285D02281FD0012800D078E15A +:10096000C84FEE51BE48295A002900D155E1BF4871 +:10097000285C0122FD2846D3FE283AD0FD2800D06D +:1009800067E1032900D248E1BF48295CA12080002B +:10099000285C00020843032235E0B14C295B092999 +:1009A00000D23AE1AF4BE85CFD22FC2801D80922D5 +:1009B0000EE0904200D04CE10B2900D22DE1AA4874 +:1009C000281800210A4601F069FDA64B295B0B227D +:1009D0001018884200D920E10A9000200126A3497E +:1009E0002A18525C401C002A21D100240728F7D97C +:1009F0002BE0052900D210E1A348281800210A465F +:100A000001F070FD0522E851022129558F21C9000E +:100A10006850964828188118914C16462A5B921BFC +:100A200004F0C5F8285B801B28530126F5E06918FF +:100A300011AC0822204601F0A8FF8D482818014675 +:100A4000224602F01FF9874B34460497EF183846C8 +:100A500001F032FE0590384601F0FCFB0790384665 +:100A600001F030FC02908348006840210391405C13 +:100A7000002111280891099108460FD17B2081009F +:100A80000691384601F03AFE09903846069901F081 +:100A90006DFE08903846069901F06DFE01903846CB +:100AA00001F032FC1F2211010691695802290ED86B +:100AB00000920390384601F07FFB07990843002815 +:100AC0000A9A3AD006982858012852D8C1E06948B5 +:100AD00000680399405C11280A9A07993B4614D193 +:100AE00018461F4601F068FB3B4607990A9A0843DF +:100AF00000280AD10898099B1843002C01D1059BB6 +:100B0000184300283B4600D1A3E05A480068039FE1 +:100B1000C05D11282DD001200021059A002A00D0A7 +:100B200008460443184601F047FB07990843012C87 +:100B30000A9A1ED100281CD18BE00898099B184303 +:100B4000002C06D00028BDD106982858002807D1CF +:100B50007FE0059B18430028B4D100980001285875 +:100B6000039B002B01D1012873D0002B01D1022857 +:100B70006FD00998089B0343002B6AD10598002881 +:100B8000049F3FD13C48285C00283BD0029B0B438C +:100B900004240320002B00D00446019808430028B9 +:100BA0000CD136482918E0B228182E4A8018142291 +:100BB00004F01CF807990A9A002838D03D20C0009C +:100BC00000291FD0285C00281CD009940BAC1422EB +:100BD000089262700020207028482918A01C03F099 +:100BE000E6FF16212046224601F061FE0998C0B2B8 +:100BF00028181C4940182146089A03F0F7FF0028DE +:100C00000ED00A9A06996858401C6850EA51412053 +:100C1000C000295C10220A432A54304613B0F0BDAC +:100C2000144800684421405C400712D50A9A1448D1 +:100C3000295C00290DD10121295406996858401CCE +:100C400068508F20C0002958491E2950002AE4D03E +:100C5000DFE6012003F0E0FF7C18002084040000A0 +:100C6000760400008A0200008B020000820200006D +:100C700085040000201D00207E0200006A020000A2 +:100C80008D0400007C0400008302000070B59EB05B +:100C90000C4601AD69460D600126002214AB3146B9 +:100CA00001F07DFE0948784404F0BAFE08358179E8 +:100CB0004120314203D1284601F0D4F9212081B2EC +:100CC0002846224601F0F3FD1EB070BD16910000CB +:100CD000F0B59FB0DE4A94786B210E021179002C9A +:100CE00004D0FF2C02D0802C00D098E10A90D94B80 +:100CF000D94F3D20C0000990385C0025002806919E +:100D000012D0F85C00280FD150790125FD21FD2873 +:100D10000AD34A1CD5B205220023A84200D01A46A5 +:100D20000325884200D015460BAE304607F046FF3B +:100D3000B085CA49084208D00BA8002181851598C2 +:100D400005F028F96F20060246E10BA805F022F90C +:100D50001590387DC24E092800D03AE10221C843DF +:100D6000801CC0B2844240D1787F002800D11CE1B1 +:100D70000520C401385D002800D12AE10025582251 +:100D80000A98294603F029FFB1494879002800D183 +:100D90000BE10A9E2336491D2922304603F007FF46 +:100DA000B64839183046FFF771FF3D55B04801216C +:100DB000395434463046AA4D01F038FE002800D19F +:100DC000F3E025204001385C00282E4600D000E1E9 +:100DD000A648042139544120C000395C10220A433E +:100DE0003A54204603F084FDDFE00791F5204000EF +:100DF0000890385C002813D1E8B206990B1A3446E3 +:100E0000FB36002B00DAE4E000216A4611605160F5 +:100E10008F4A1018421D3846283004F07DFF2646C0 +:100E2000787F00282FD08F4C385B069D4119FB3608 +:100E30007D229200914200D9CBE038188A494018AF +:100E40008349491D2A4603F0B2FE385B40193853E6 +:100E5000FFF778FD002804D04120C000385CC006B0 +:100E6000F6D58F20C000385800287D4E0BD1412088 +:100E7000C100795C1022114205D17C4B0324FC5443 +:100E80001143C00039540998385C714A917800299F +:100E900024D0002811D120206946486017A8086096 +:100EA000384694306A494A1D0121069B04F034FFFC +:100EB00067490998385C002850D00898385C0028A9 +:100EC00022D020206946486017A80860172000013A +:100ED0003A1838469430012160233CE000280BD1B9 +:100EE000002168460160416038469430584A521DDE +:100EF000069B04F011FF564A5F48012139525548BC +:100F000039540020107050E0202468461B2109014C +:100F1000791801600A46039244603D462835012154 +:100F2000049100230593284604F0F6FE284604F0B9 +:100F300013FF6846039A14C02846049D2946234699 +:100F400004F0EAFE6846446017A901603846943010 +:100F50003F4A2946059B04F0DFFE3D49787F002883 +:100F600029D04348385C002804D1002158220A982F +:100F700003F033FE3F48006801790A9C6170807974 +:100F8000A07020464C30082104F0B8FE3A4807997A +:100F9000395200202E4908704870787F002811D0FF +:100FA000E01C17A9202203F002FE159804F0F2FFBE +:100FB0000920060333E03048079A3A52002048706F +:100FC00008700A9CE11C17A8202201F059FC002897 +:100FD00028D0159804F0DEFF274C002038533875D0 +:100FE000204D7A5B20483918194803F0E0FD785B02 +:100FF000385304F0C3FF0BA9884202D1159804F0BE +:10100000C9FF1A4801213954164800243C521C4893 +:1010100038180822214603F0E0FD1A483C54B0B2CB +:101020001FB0F0BD0898385C7B218900795C0143D2 +:1010300009983A5C0A20002A05D0090603D101204C +:10104000089978540020387509200603D1E7C04676 +:10105000E81F0020810200007C180020FFFF000034 +:10106000856900007604000082020000840400000C +:101070007E020000201D0020060200006A0200001F +:10108000850400008D04000070B521200001134D7F +:101090002818FFF71DFE04464120C600A85DC006C3 +:1010A00019D50F48295C042904D0032905D103F080 +:1010B000ABFB04E0012129540DE003F07FFB002885 +:1010C00009D1084800212952A85DEF220240AA5503 +:1010D0002975D520C401204670BDC0467C1800206B +:1010E0008404000006020000F0B581B08F20C70024 +:1010F0003D4DE8593D4C295D022901D1401EE85182 +:1011000009210E030028009629D039482818CE015D +:10111000AA598118374C2B5B9A1A03F048FDA8593D +:10112000295B081A28534120C600A85DEF21014021 +:10113000A955FFF707FC002802D0A85DC006F8D526 +:10114000A85DC006009E294C09D503F037FB014677 +:101150000120002945D100202875D520C601295D30 +:1011600002290AD1E859002807D10320285503F0A5 +:101170004BFB002807D0295D0AE0320A0020009BC3 +:101180009E420CD12DE0002129552975D520C6019C +:1011900001200022009B9E4200D01046320A164FCA +:1011A000EB5B164CE2549A1CEA535B1C9BB2E65470 +:1011B000002801D003290FD101200C4968540D48A3 +:1011C00000242C520E4828180822214603F005FD61 +:1011D0000C482C5408482A5A91B2202003F066FF8C +:1011E000002001B0F0BDC0467C180020840400003F +:1011F000820200007604000006020000E81F0020C2 +:10120000850400008D040000F0B585B0744D2F7981 +:101210007C4C7C44204604F003FC808801F029FDCE +:10122000204604F0FDFB6F4EF21C8088C0B20428FB +:1012300000D9D2E0049701273946814016200142A7 +:1012400000D1CAE0A878684A7632802808D0002801 +:1012500000D0C2E03902654B03245C5400211975AB +:10126000EC788023052C59D8012C57D0002874D154 +:10127000581CC1B200208C4200D00746A01E02902C +:101280005A48407F002803930CD118462A30C0B238 +:101290000090019104F002FE0199009A90423246BA +:1012A00000D09AE07B208000504A13461F541F2034 +:1012B000000100221A5001208C4201461E4600D037 +:1012C0001146029BDBB2042B034600D3134619439D +:1012D0003D23DB00F1547077F283454909684023D0 +:1012E000CB5C444972540326744002265E40264378 +:1012F000002E00D01046FF263246EA323B49885481 +:101300001A2B14D8012098403B4A10420FD0E8789D +:10131000052808D004280AD1012005E0802C1CD023 +:10132000812CA3D059E00220324A304988543348F6 +:1013300000242E4F3C54F52040003C5430483818CF +:101340001822214603F049FCEC36BC550520C001AB +:1013500001213954EC78A878039B049FFF21EC31DC +:10136000224E3D22D2009C422BD0B25C002A28D0D3 +:10137000725C002A25D1984223D128790A38C0B25C +:1013800031281ED8687902281BD8012808D1A879ED +:10139000382805D1E879322802D1287A002810D0DF +:1013A00025204001305C00280F4A16D101207054DE +:1013B0004120C000315C10220A43325403F0B8FAD5 +:1013C000049F7D20800037543F20C000691D3150AC +:1013D000022001F013FD0920020390B205B0F0BD18 +:1013E000E81F0020826900008A6A00007C18002043 +:1013F000201D00208E040000800140048F040000A6 +:101400006A020000AA8B0000F0B593B0724C7C44D5 +:10141000204604F005FB808801F02BFC204604F0F8 +:10142000FFFA8088C0B2634F04283ED801252946C0 +:1014300081401620014238D05F4E6B200002B17807 +:10144000002902D0F178002930D1672000023179DB +:1014500007292BD305AC204607F0B0FBA0855749E0 +:10146000084208D005A8002181850F9804F092FD5C +:101470006F2007020EE005A804F08CFD0F90504984 +:10148000087D0A2803D1FB3770790B2811D30F98F8 +:1014900004F080FD4A480021017504F06FFD05A9A4 +:1014A000884202D10F9804F075FD384680B213B01F +:1014B000F0BD44480818741D29220490214603F009 +:1014C00076FB707980002843215C20184418601C4A +:1014D00000262946324601F005F8039064793A481F +:1014E00037490C543D48784404F09AFA8079042135 +:1014F00008420DD1354800684021415C022902D0E4 +:10150000816B002951D0412CC1D1806B0002044372 +:101510002F482B49085C00281DD111AD284603999E +:1015200001F0BDF9281D214601F0B9F97B208000AA +:101530002349085C002804D011A8082100F01AFEF5 +:1015400009E06846066046600846283011AA08236C +:10155000314604F0E1FB0021049D284601F0B8FA71 +:10156000002805D00120014600F03AF8144C09E0AB +:101570004120C000124C215C10220A43225428460C +:1015800003F0C6F925204001205C09210F03002843 +:1015900083D010488168491C81604268914200DA1A +:1015A0007BE75D210122425477E7012C2C46AFD026 +:1015B0006DE7C04685690000E81F0020FFFF0000BE +:1015C0007C1800203302000066020000201D00206D +:1015D0008E04000000180020AE890000D6880000AC +:1015E000F0B5B1B0002818D0039100216846016021 +:1015F0003448354C201827AB0A4601F0D0F97B203F +:101600008000205C00280FD02020694648601FAA77 +:101610000A604120800020180DE02D4B2A4A00204E +:10162000D052692285263BE02020694648601FAAE7 +:101630000A60204628300121002304F06DFB04AF2E +:10164000384604F089FB2025684645601FAE0660D9 +:1016500001243846214632462B4604F05DFB1E48E5 +:10166000784404F0DDF98079400820406946FF2283 +:1016700052320A60486027A8144C31462A46234655 +:1016800001F0C4FA6178C81C114A0F4B9852114AF4 +:101690009A5C61188A707A21CA430B32002603993A +:1016A00000290DD183B2094CE254821C084B064D2F +:1016B000EA52401C80B2265491B2202003F0F6FC7E +:1016C00031B0F0BD330200007C180020E81F00207C +:1016D00006020000660200005C870000F0B581B0E1 +:1016E00067200602284D287901282AD1284C7C44FD +:1016F000204604F095F9808801F0BBFA204604F0FA +:101700008FF98088C0B2214FFF2819D02148784432 +:1017100004F086F98088FF21084211D0FE1E04F0F3 +:10172000BDFBAA280DD16C791B48784404F078F9E8 +:10173000092109038088C0B2844205D10E4600E029 +:101740003E46B0B201B0F0BD3E46FB36082CF8D89C +:1017500000910120A0408B2149000842F1D00F4D9B +:101760007D44284604F05CF9408801F082FA28465E +:1017700004F056F9408820423E46E2D0204600F070 +:1017800079FC009EDDE7C046E81F00208569000067 +:10179000CE860000AE860000928600005C860000C7 +:1017A0006D20000270470000F0B58BB009AD00213C +:1017B00006262846324603F010FA0A200A99014309 +:1017C000297101242846214601F04CFA02202843C1 +:1017D000214601F047FA124F7F44384604F020F9C1 +:1017E000801C2946324604F07BFA6D4620262846A6 +:1017F000314604F083FA384604F012F908302946DD +:10180000324604F06DFA08AD2C70384604F008F941 +:10181000401C2946224604F063FA0BB0F0BDC046D6 +:10182000E4850000F0B581B0017800250091002921 +:1018300018D0441C002701250026204629463246A0 +:1018400000F050FE80B2094988420BD00849884216 +:1018500007D0241D7F1CF8B2009988423546EAD390 +:1018600000E00225E8B201B0F0BDC0461DB10000A5 +:101870001EB10000F0B599B0A94EB778802038436A +:101880006B210D02802800D040E130790B90F47874 +:10189000002F04D1022C02D3802C00D036E1D520B9 +:1018A000C5010C95FE3D04F0F9FAAA2800D02DE1FF +:1018B0000DAD284607F082F9A8859A49084208D05C +:1018C0000DA800218185179804F064FB6F200502A4 +:1018D0000CE10DA804F05EFB1790002F26D04D21DF +:1018E000CA00914C99218D00615B002900D1FAE07A +:1018F000A25A8A4200D0F6E0084600F077FF00289E +:1019000000D1EFE0625B894820187D21890000F05A +:1019100079FF002800D1E5E085482018FFF782FF15 +:10192000002873D000F00EF90546E7E0012C27D817 +:10193000212000017C4D281800275822394603F049 +:101940004CF970790B2800D3CCE07B480068017912 +:101950007A4AA95480797A49685475482818711DC3 +:10196000292203F024F970798000012101437218C3 +:101970005079002C56D0927900021043072252E091 +:1019800099218D00684C615B4D22D700E25B0B9B77 +:10199000D2188A4200D9A6E0084600F027FF0028A6 +:1019A00000D19FE021460024684604604460084658 +:1019B0002830721D0492214605950B9D2B4604F09C +:1019C000ABF9684604604460574894302146049A55 +:1019D0002B4604F0A1F95449C85B08185349401834 +:1019E00004992A4603F0E3F84F4BD85B4019D853CB +:1019F00034700599595A82B2092005034D48914225 +:101A000000D086E002211952747063E04120C000CA +:101A1000215C10220A432254179804F0BBFA0920D3 +:101A2000050373E0062299239C0028538918002897 +:101A300058D0079100F0DAFE002853D04D200894CA +:101A4000C4000A972F532F462835284604F084F9FE +:101A500038469430069004F07FF90994385B089C6E +:101A60000B99491D079A891ACBB21818395B88421D +:101A700038D868460A9F07604760B2180392284624 +:101A800039461D4604F048F96846076047600698E5 +:101A90003946039A2B4604F03FF923480146099C36 +:101AA000085B08182149401803992A4603F07FF87B +:101AB0001D49085B281808530A4637700899515A7F +:101AC00082B2092005031B48914225D10221164B01 +:101AD00019527770154818187D21890000F092FE80 +:101AE00000280BD1179804F055FA0C9D2120000115 +:101AF0000D4908180021582203F06FF804F03EFA4F +:101B00000DA9884202D1179804F044FAA8B219B07E +:101B1000F0BD01211952F1E70121034A1152EDE70D +:101B2000E81F0020FFFF00007C1800208202000058 +:101B30003302000006020000201D002011020000F8 +:101B400012020000F0B5A1B03748384F00243C52D3 +:101B500003AD284607F032F8A8853549084207D07A +:101B600003A884850D9804F015FA6F20040242E062 +:101B700003A804F00FFA0D902021029168464160FD +:101B800019AE0660294F28370125384629463246C6 +:101B9000234604F0C1F8384604F0DEF868460660D3 +:101BA000029B436038462946324604F0B5F8684641 +:101BB000046020481D4908180FAF214622463B46C5 +:101BC00000F0EDFE1D48784403F02AFF80794008BC +:101BD0002840694664220A604860174C3846134F13 +:101BE0003146029A234601F011F86078801C0E49B4 +:101BF00078520920040304F0C1F903A9884202D1F4 +:101C00000D9804F0C7F9212000013818002158224E +:101C100002F0E3FF03A8808D002802D1204621B006 +:101C2000F0BD02F0F9FFC046060200007C1800205B +:101C3000FFFF000033020000E81F0020F6810000D3 +:101C400070B525204001094D285C002801D0084CC2 +:101C500009E04120C600FFF70DFE0446A85DC0065E +:101C600001D502F009FE204670BDC0467C18002058 +:101C700082690000B0B5014669228520002902D0A2 +:101C8000FFF760FF020A0749074B5C5A074D2A55C8 +:101C9000A21C5A52611C89B2685491B2202003F0F0 +:101CA00005FAB0BD060200007C180020E81F0020E5 +:101CB0006D20000270470000F0B589B01E4617463F +:101CC0000A460024E543782A00D987E0002A06D096 +:101CD0000024015D002902D1641C9442F9D30490D0 +:101CE000111B8A2048436421069206F0B5FC034686 +:101CF0005A1C306898423FD9019602950021384617 +:101D00000092059302F069FF059B039406988442B4 +:101D100026D21946039A04980792805C491E0891BE +:101D20001C46395D09020E183D463A2730463946B1 +:101D300006F01CFD4743F11B2F46395539360899EB +:101D40008C4201D8732E04D3611E002C0C46E8DCB3 +:101D500000E02146079A521C06988242059BDAD180 +:101D60000021039A029D019E785C002806D1481C40 +:101D700099420146F8D302E032602FE0084600990C +:101D80008918091A336831608B4227D3131A002B44 +:101D900010DB481E0028059B19DB134878447C188B +:101DA0001E46BB5DC35C635533465B1E491E00295E +:101DB000F5DC0CE08A420AD20A49794414463B5CBD +:101DC000CB5C3B55401C641C33689C42F7D30748EE +:101DD00078440178384602F000FF0025284609B013 +:101DE000F0BDC0460A70000028700000F46F0000CB +:101DF000F0B595B000920F4602900AAC2A21204619 +:101E000006F0A0FD022004430594790001400D2254 +:101E10000A4303924140881D019013250021029836 +:101E20000491405C0690002107200991401A01218D +:101E300008918140069801400791ECB2142C0ED80D +:101E40001520021B60000AA90E183188C81C04293D +:101E500000D808463080521EB61C002AF5D160001A +:101E60000AA9085AFF34072800D82C46E0B21328E4 +:101E700017D814210D1A400005990A180AA90E5AFC +:101E8000138801210027072B084600D83846760022 +:101E90000E2737400743C8431752921C6D1E1E463B +:101EA000EED107980028089A00D102461498400005 +:101EB0000E21014011430AA801850999491C0829EE +:101EC0002546B1D10499491C08292546A7D10021EE +:101ED0000B460A460C46009ED8B240000AAD285A6E +:101EE000240603D1002801D10C4604E0D4B23030DE +:101EF0003055521C01245B1CD8B2039D8542EBD89F +:101F00001106019D02D130213170012200242146A9 +:101F1000CEB2B5420D4622D9361876000AAFBE5B66 +:101F20006D1C002E04D1EEB2019FB742F4D816E02A +:101F30002506009F04D1D4B22E253D55521C012404 +:101F4000DDB26D000AAE755B3035D6B2BD55521CA0 +:101F50005B1C491CCDB2019EAE423546D8D8D0B2EA +:101F600015B0F0BD80B583218900044A5258044958 +:101F70000968496CFFF73CFF80BDC0467C18002013 +:101F8000201D0020F0B583B02B4D00262B4A28469B +:101F9000314602F022FE2846314600F063FE284812 +:101FA0002E52252040012E54264801242C54264828 +:101FB00028180822314602F010FEFF20EC302E5483 +:101FC00022482E542248784403F02AFD4078012804 +:101FD00001D0FFF7E9FB1F48784403F021FD40786A +:101FE000002807D01C48784403F01AFD808800F0D0 +:101FF00040FE02E0FF2000F03DF81848784403F06E +:102000000FFD0078002814D102AD2C7001AE3470A1 +:10201000134F7F44384603F003FD293031462246F2 +:1020200003F05EFE384603F0FBFC2946224603F02F +:1020300057FE03B0F0BDC0467C180020A404000089 +:102040007604000084040000850400008D04000074 +:10205000F67D0000E47D0000D67D0000C07D00001C +:10206000AA7D00004021415C01220A400221114367 +:102070000170704710B582B0014601AC204600F0F7 +:10208000F1FD0548784403F0CBFC001D02222146F7 +:1020900003F026FE02B010BD387D0000F0B58DB013 +:1020A00007464120800032490D180C46284603F0AF +:1020B00053FE00266846066046607720800022189E +:1020C00004232846314603F027FE68460660466032 +:1020D000172000012218202428463146234603F009 +:1020E0001BFE6846066046601920000120490A1858 +:1020F00028463146234603F00FFE0C960B960397B5 +:1021000008377D2084000CAA0BAB3846214600F02E +:102110000DFA002828D00B980C9900266A46166004 +:1021200056600B18083328463146039A03F0F4FD35 +:1021300004AA3846214600F023FB002813D0684645 +:102140000660466004AA1A232846314603F0E4FDDF +:10215000684606604660082328463146039A03F025 +:10216000DBFD012600E0002630460DB0F0BDC04684 +:102170007C180020F0B583B00C4605460026684662 +:1021800006604660412080000A490F181B200001AC +:102190000A1820233846314603F0BEFD6846066023 +:1021A0004660384631462A46234603F0B5FD03B063 +:1021B000F0BDC0467C18002070B504461E4E306845 +:1021C000416B002911D01D4979440322204602F0B9 +:1021D0000DFD012500282CD0194979440322204601 +:1021E00002F004FD002824D030684021405C132810 +:1021F0000CD1144979440422204602F0F7FC00284F +:1022000016D118341049794428220BE00F4979443B +:102210000422204602F0EAFC002809D118340C49B7 +:1022200079440222204602F0E1FC0125002800D07A +:102230000025284670BDC046201D0020BD6B000053 +:10224000AE6B0000976B0000896B0000436B0000D1 +:10225000356B0000B0B50446154800684021405C6D +:10226000132810D1134979440322204602F0BEFC02 +:1022700000281AD11734104979442722204602F049 +:10228000B5FC01250FE00D4979440322204602F0F8 +:10229000ADFC002809D117340949794401252046AD +:1022A0002A4602F0A3FC002800D000252846B0BD35 +:1022B000201D0020F56A0000E66A0000CF6A0000D9 +:1022C000C06A0000B0B504460C480068406B0028A6 +:1022D00010D00B4979440322204602F087FC0125E7 +:1022E000002808D0074979440322204602F07EFCEA +:1022F000002800D000252846B0BDC046201D002083 +:10230000B16A0000A26A0000B0B504461B497944D6 +:10231000032202F06BFC002809D120462330184923 +:10232000794401252A4602F061FC002824D0154991 +:1023300079440322204602F059FC002809D12046A6 +:1023400023301149794401252A4602F04FFC002828 +:1023500012D00E4979440322204602F047FC00289F +:1023600009D143340A497944012520462A4602F01E +:102370003DFC002800D000252846B0BDA96A000019 +:10238000A06A00008A6A00007C6A0000696A000096 +:102390005A6A0000F0B586B0FF2414700468002764 +:1023A0008C421AD20B9E002B01D000241C60002E00 +:1023B00001D00024346005684C1B012C0DDB059214 +:1023C0002A46551C056014784E2C5FD804954C2C79 +:1023D000039704D22746049D45E03C4659E0002778 +:1023E0004E2C26D04D2C0DD04C2CF4D102943746D7 +:1023F000049C0E1B0024012E3E464ADB951C056002 +:1024000057782FE002940196049C0E1B0024022EA4 +:1024100015463EDB009300231C461F46049AD65CFB +:10242000E4B2A640F7195B1C0834022BF7D1ED1C6F +:1024300015E002940196049C0E1B0024042E154600 +:1024400027DB0093002423462746049A165DDBB25F +:102450009E40F719641C0833042CF7D16D1D0560EC +:10246000009B019E029C491B002915DB0495254613 +:10247000B942039C0DD3002B01D004991960002EA2 +:102480002C4600D037600168C919016005980470B6 +:102490000124204606B0F0BD039CFAE7F0B581B0F8 +:1024A00000920722D34308240029224600D01A466E +:1024B000002900D10C4600252946465D7F2737407C +:1024C000002D334600D13B46009F002F00D01E4612 +:1024D000E3B29E4071189C186D1C022DEDD1084688 +:1024E00001B0F0BDF0B581B000920722D3430822BD +:1024F000002900D01A461824002900D10C460025D6 +:102500002946465D7F273740002D334600D13B46A4 +:10251000009F002F00D01E46E3B29E4071189C1809 +:102520006D1C042DEDD1084601B0F0BDF0B5044698 +:1025300000201060186000291FD02578FD26FC2D92 +:1025400001D8012710E0032917D3B54215D1601C2B +:10255000002426462546075DF6B2B7407D19641C67 +:1025600008360327022CF6D115601F601068C319C6 +:10257000012000228B4200D91046F0BDF0B585B095 +:10258000144602460020FD26002B029608D00023A8 +:1025900000291BD01578B54205D201212B4616E043 +:1025A0000B46014613E0032910D3B54219460ED15C +:1025B000561C00252F462B46715DFFB2B940CB1843 +:1025C0006D1C08370321022DF6D100E01946029D4B +:1025D000AD1C04AE357055180395D2185518002B54 +:1025E00017D0002637466846066003A804AA294685 +:1025F0003346FFF7CFFE00280AD004A80178781CE4 +:10260000A14200D038460399A9420746EBD100E029 +:10261000384605B0F0BDF0B585B002920027FD2226 +:10262000002B08D0002300291BD00478944205D247 +:102630000121234616E00B46394613E0032910D347 +:10264000944219460ED1441C00252E462B46615D4E +:10265000F6B2B140CB186D1C08360321022DF6D11D +:1026600000E01946921C04AC227042180392C01874 +:10267000451802980128019716DB002B019F13D003 +:102680000B9C0A9E00276846046003A804AA2946FA +:102690003346FFF77FFE002806D07F1C0298874252 +:1026A00002DA0398A842EED1012002998F4200D0AD +:1026B000019805B0F0BD000070B501464A780123CD +:1026C00000246A2A184600D020460B4D2D6840266B +:1026D000AD5D022D00D023461843022D0AD16A2A8F +:1026E00008D00020002A05D18A78012000216A2A1A +:1026F00000D0084670BDC046201D002080B5C12214 +:1027000000F002F880BD0000F0B581B015460E461D +:102710000746FFF751FD0024002804D13846FFF793 +:1027200099FD002802D0204601B0F0BD0E48006897 +:102730004021405C7978022807D16A2905D0002918 +:1027400007D1B8786A28EED003E06A29EBD00228D6 +:10275000E9D00123384631462A46FFF70FFF00240F +:102760000128E0D10446DEE7201D002080B5C2220A +:10277000FFF7CAFF80BD80B5C422FFF7C5FF80BD4B +:10278000F0B585B0144600270497039703AA6B465B +:102790005A6004AA1A60022201263346FFF73BFF63 +:1027A00001283D4600D1054604990029304600D154 +:1027B000084605400398142800D03E463540002DB9 +:1027C00011D076206070192020701422E2707720DA +:1027D000C64330462130A070201D02F0E8F92436AF +:1027E000667688202076284605B0F0BD0146012097 +:1027F0000023F629024600D01A46B42900D0184614 +:1028000010437047B0B501240023F62A254600D0B6 +:102810001D46B42A00D01C462C438A422BD8002CDB +:1028200029D0F62A03D1B421415C412923D10022C9 +:1028300044231146C45CD2B2944061185B1C083238 +:10284000482BF7D100238A0715D100234C241A46C0 +:10285000055DDBB29D40AA18641C0833502CF7D1EB +:10286000064B012000249942034600D82346002A43 +:1028700000D0204603401846B0BDC0465BAC826025 +:1028800070B50023002A08D00023521E94B2055DC3 +:102890000E5D6E403343002CF7D1D8B270BD01708D +:1028A0000A0A42700A0C8270090EC1707047F0B5B6 +:1028B000A3B0164603AC202522462B4603F058FA57 +:1028C0000BAF384603F03CFA142069460E604860AE +:1028D0000121384622462B4603F01EFA23B0F0BDF4 +:1028E00070B588B014466D4620262A46334603F05C +:1028F0003FFA284631462A46334603F039FA042285 +:102900002046294602F053F908B070BDF0B58BB0EF +:102910001D4614460346109E02270120FF2E00D8B4 +:1029200007461198002808D014203843C2B202A8E4 +:10293000194602F03CF9FFB20EE0FFB202A8C2193C +:102940001846FFF7B4FF300A04D002A84670310AD7 +:10295000017001E002A806701421394302AEF21999 +:1029600014323046FFF7BCFF01951821394301AB03 +:1029700030462246FFF7A0F9002803DB01A80088B3 +:102980000BB0F0BD012002F047F9002A06D0491E25 +:102990008B5C0370521E401C002AF9D17047F0B5C1 +:1029A0008DB0174606780B2E3CD201910293002E73 +:1029B00013D0401C0021182200252B46445DD2B2C2 +:1029C0009440E3186D1C083A042DF7D18A0003AC3B +:1029D000A350491C001DB142EDD102F007FD68462D +:1029E0000760212703AD3846294632462B4603F0BF +:1029F00037FA202238462946029C234603F0DCF9A8 +:102A00000198002805D0129921200123224603F0C5 +:102A1000E3F902F0EBFC03A80021202202F0DDF82C +:102A20000DB0F0BD022002F0F7F80000F0B58DB057 +:102A3000024610780B2843D2012600283DD002968A +:102A40000191521C0024182500273E46D35DEDB2AB +:102A5000AB409E197F1C083D042FF7D1A30003ADA6 +:102A6000EE50641C121D8442EDD10528029E24D133 +:102A70000126F207039B53402C2B03D0542B01D08B +:102A8000312B1AD110490B681C88002C06D0049DEC +:102A90005540A54202D059888D420ED16432059925 +:102AA00091420ADC06990198814206D1074A079BA8 +:102AB00001260021934200D80E4630460DB0F0BDED +:102AC000022002F0A9F8C046201D002050C30000DB +:102AD000F0B58DB002461F4803681C880120002C09 +:102AE00033D01078022801D208462EE001910293DB +:102AF0000B282CD2521C0025182600273B46D15DFE +:102B0000F6B2B140CB187F1C083E042FF7D1A900C4 +:102B100003AE73506D1C121D8542EDD10122D30707 +:102B2000039858402C280299019D04D0542802D0C3 +:102B30003128284609D1049D5D40A542104604D0A5 +:102B40004A88012000219542CED10DB0F0BD02206F +:102B500002F062F8201D0020F0B585B004920C460A +:102B600002780B2A4CD2202121700121002A3DD06D +:102B70000499891E0191461C0023012102920393AE +:102B8000182000221546B35CC0B283405D19521C68 +:102B90000838042AF7D1C9B26018049A511A0122E0 +:102BA000D2072B469343184A7A4402F065FD274624 +:102BB0002046049906F0BCF8C1B2361D019A914234 +:102BC0001BDA002D039B01DB3C4603E027223C4639 +:102BD0006254401CC1B22F226254411CC8B2002270 +:102BE00022545B1CD8B2029A9042C8D3C8B2401E8D +:102BF00000212154C0B205B0F0BD032002F00CF852 +:102C0000022002F009F8C04619620000F0B587B052 +:102C10001C4617460591064602F0E8FB0020069088 +:102C200006AD6846C5600C998160446007600D98E8 +:102C3000002801D00A4900E0084903223046059BDC +:102C400003F0DAF82878C00703D020780121014387 +:102C5000217002F0CBFB07B0F0BDC04601040000BC +:102C6000010600000A020A43FF21090251400180C7 +:102C7000704780B5FF218143000A814201D003F0F3 +:102C800025F880BDF0B5002307241E46155D0F5DB5 +:102C9000F619751905550126FF2D00D81E46671E29 +:102CA000002C3C46F2D101200021FF2D00D808461F +:102CB000F0BDF0B581B0002607240096155D0F5DCC +:102CC000330604D0AF4204D97F1E002303E0009BEB +:102CD00001E0FF373346BFB27E1B06550126AF42E7 +:102CE00000D31E46631E002C1C46E7D1F0B201B093 +:102CF000F0BD000070B582B0044601263002114DCF +:102D0000285C30420DD03F20C0002A580021684680 +:102D10000160416028462830234602F0FDFF300262 +:102D2000285C80070BD53F20C0002A580021684648 +:102D30000160416094352846234602F0EDFF02B061 +:102D400070BDC0467C180020F0B581B07D208600A3 +:102D5000294DA85D002848D03F20C700E8590478D5 +:102D6000FC2C05D801252846FFF7C4FFFF2031E0E1 +:102D7000FE2C19D0FD2C3BD10120FFF7BBFFE859F9 +:102D8000411CE951A95DFF31A955C9B201292CD9CE +:102D900041780091847802252846FFF7ABFF240292 +:102DA00000980443FE2015E00120FFF7A3FFE85937 +:102DB000401CE851A95DFF31A955C9B2032914D9B6 +:102DC00000210A46FFF78EFB044604252846FFF73C +:102DD00091FFFC2008490A46D1594919D151915D0A +:102DE00040189055204601B0F0BD012001F014FFBD +:102DF000022001F011FFC0467C180020F0B5BFB0E2 +:102E00000646E948784402F00BFE857933AC20464B +:102E100005F0D4FEA085ED0801273D4084B2002CCA +:102E200001D000F065FC33A803F0B4F83D90002D0C +:102E3000199700D119951B951DA8C01D189025A89C +:102E4000011D169128301790F1481C961A970746D5 +:102E50006AE2072800D067E23C69002C00D161E2F9 +:102E60007D208500785D002801D100F030FC84428F +:102E700000D30446002CE64F01D100F028FCE0B25C +:102E8000FFF738FF3F20C000395809193950785DE5 +:102E9000001B78553869001B386145E24E7834468E +:102EA000083CE1B2302901D900F01FFCB11C11919E +:102EB000C9B2884201D200F018FCD648784402F02A +:102EC000AFFDD349149D49596A46566025AB059319 +:102ED00013608A1C08302021234602F059FFCC4899 +:102EE00040598019811F08220598FFF7C9FC002866 +:102EF00000D0FAE3C64D149EA8593D21C9006A5C72 +:102F0000002A0DD03A22825C3223C254A859401DB7 +:102F1000A851EA5DF332EA55695C012200293DD1EE +:102F2000811C25AE3046224601F041FE3078322821 +:102F300000D0DAE3B6480546149EAC591698A8515D +:102F40002420FFF7D7FE11996018A851E85D401AB8 +:102F5000E8552F461DA808221799FFF716FD0020F7 +:102F600001460246189E735C7C18257F5219D318BF +:102F700023770122FF2B00D80246491E0C46083455 +:102F8000F1D10125FF2B00D885E0AEE33D20C00044 +:102F90009F49085C0022002800D1A6E31392012675 +:102FA0003046FFF7A7FE9A4D14996858421C6A50A4 +:102FB000E85DFF30E855C0B2232800D895E3F5203E +:102FC0004000285C002826D034022E552420FFF72C +:102FD00091FE00200C942855149C29592431295124 +:102FE000E85DDC30E855C0B2072800D87DE30F204B +:102FF000400128180822039201F0D9FD0398FFF739 +:1030000079FE0C982E54285908302851E85DF83084 +:10301000E855139D3FE0002168460160416017209C +:10302000000128182424234602F076FE2046FFF7EC +:1030300061FE1498295824312950E85DDC30E855A8 +:10304000C0B2072800D850E31DA80822FFF79DFC56 +:10305000002001460246189B5B5C6D4C6418257F7E +:103060005219D3182377FF2B324600D80246491E47 +:103070000C460834EFD1FF2B139D00D935E308200F +:10308000FFF738FE62480146149A88580830885085 +:10309000C85DF830C8553D20C0005D4A105C00286E +:1030A00002D10120010250541C9E159CFFF74CFEDA +:1030B000574F3861022171403D22D200BB5C2B4347 +:1030C0000B430022002B214600D0114600281A9AFB +:1030D00000D104460C4054401B98002802D1002C1B +:1030E00000D102E3022038757D25AC00385D002850 +:1030F00000D1ECE2396901291A9B20D13F20C6009A +:10310000B859007801210022AE2800D11146199A41 +:103110001143012906D101210022AE2800D1114618 +:103120005940F9770120FFF7E5FDB859401CB85127 +:10313000385DFF3038553969491E39611C9E0029B8 +:1031400017D04D1EC0B2854200D30546002D304F2A +:1031500000D1BCE2E8B2FFF7CDFD3F20C0003958F6 +:1031600049193950385D401B38553869401B386162 +:10317000DAE0022E1ED13D21C900795C002915D06C +:10318000F5214900795C002914D0002168460160CE +:1031900041600F2040013A1838462830082302F0D9 +:1031A000BBFDA800385C05E0B86F000001210902F2 +:1031B00003227A54C0B2032800D896E2F5204000DA +:1031C0003D21C900795C00290ED0385C00280BD164 +:1031D0003F20C0003A5800216846016041603846EF +:1031E0002830042302F098FD0420FFF783FD3F20E0 +:1031F000C0003958091D3950385DFC303855012060 +:103200003875B868401EB860F868401CF8608BE0FC +:103210007C180020006F0000F5204200B95C3D25BD +:10322000E800385C00284FD000294DD120266846A0 +:10323000466025A909910160172000013C180B94F4 +:10324000012104910023089320460F92099F3A46DA +:103250000E9502F061FD204602F07EFD6846076093 +:1032600046602046049D29463A46334602F054FD06 +:10327000684646601DAF0760ED4C2834204629465D +:103280003A46089B02F048FD204602F065FD68467C +:1032900007604660204629463A46334602F03CFD28 +:1032A0000B980999324601F082FC19200001E0498F +:1032B00008183946DE4F32461C9E01F078FC0F9804 +:1032C000395C0E98C000385C002822D0002920D03C +:1032D000D848385C00280BD1002168460160416065 +:1032E0001B2000013A1838462830202302F014FD34 +:1032F0000A20387518E0052816D17D208400385D35 +:10330000002800D1E3E13D69002D00D01BE7042037 +:1033100076E709213975002806D03846283002F0B2 +:103320001BFD01E008203875397D00E03975C8B211 +:10333000042807DC02286EDD03282AD00428F3D1F4 +:10334000B86836E0062800DDBBE1D4D17D208400DA +:10335000385D002800D1BAE1032800D8C5E1042077 +:10336000FFF7C8FC3F20C000E74F3958091D39500E +:10337000385DFC3038550821FF221042D6D0012498 +:10338000250200207855FFF7DFFC7C5538610721C6 +:10339000CCE7022E00D13FE77D208000385C00287A +:1033A00000D194E1FFF7D0FC0021B860F96004215E +:1033B000397506210028B9D07D208400385D0028A9 +:1033C00000D184E1072800D88FE1012ECE4F11D122 +:1033D000012040023858F96881420BD13F20C000DB +:1033E000395838461530082201F0E1FB7F20800073 +:1033F000012139540820FFF77DFC3F20C0003958D7 +:1034000008313950385DF8303855FFF79DFC386188 +:103410000520387571E7002806D0012802D002285F +:1034200082D161E6B868E0E00026BE60FE603E61E1 +:10343000384615300822314601F0CFFB3D4628358D +:10344000284602F089FC3C469434204602F084FC75 +:103450003D20C000385C00283AD0012000023E54D4 +:10346000F5204000385C00282DD068460660466094 +:10347000772080003A1804232846314602F04CFC9D +:10348000684606604660172000013A18079220201F +:10349000069028463146069B02F03EFC68460660D0 +:1034A0004660192000013A1828463146069B02F072 +:1034B00033FC684606604660602320463146079A22 +:1034C00002F02AFC04E017200001381802F044FC46 +:1034D0007D2010908600B85D032800D805E13F20CC +:1034E000C5007959772080001290381804240A907A +:1034F000224601F05CFB2046FFF7FCFB7859001DDB +:103500000D957851B85DFC30B8558049795C00293B +:1035100017D0C0B2032800D8E7E07B4F0D9D795942 +:103520004920000138180424224601F040FB2046BF +:10353000FFF7E0FB7859001D7851B85DFC30B855B5 +:103540001FE0734800684021405C16280A9C18D888 +:10355000012181406F48014213D0002120460A46D4 +:10356000FEF7C0FF00280CDA002120460A46FEF7CD +:10357000B9FF6949884204DB109880006249085C01 +:10358000C7E7634800684421415C890718D5007A81 +:10359000022806D0042813D15B481299405C012808 +:1035A0000ED8594CA05D032800D89EE00420FFF7F8 +:1035B000A1FB0D996058001D6050A05DFC30A05526 +:1035C000FFF7C2FB504FB860252149011C9E022E17 +:1035D000524A08D1795C002905D05168002900D1F0 +:1035E0005060002111600121397500281DD07D2017 +:1035F00039468700C85D002869D00124022E1BD0FF +:10360000012E254600D051E523286ED92420FFF74E +:1036100071FB3F20C0003C490A461158243111502B +:10362000D05DDC30D055012540E5032038757BE6C0 +:103630007C1800208E040000012856D93F21CA00C2 +:103640001492314989580A78022A159400D19DE4D0 +:10365000012A00D122E4002A47D13D20C0002A4996 +:10366000085C002841D12E4C7C44204602F0D8F959 +:103670008088FFF7FEFA204602F0D2F98088C0B2B7 +:10368000042806D0022804D001282ED11B98002837 +:103690002BD01D4C149D6059401C6051E05D401EB4 +:1036A000E055C0B2232820D92420FFF723FB60591E +:1036B00024306051E05DDC30E0550120A07700252A +:1036C000E9E401460839032901D3FFF7C2FB02F000 +:1036D00055FC33A9884202D13D9802F05BFC33A827 +:1036E000808D00280DD13FB0F0BD012001F094FA8B +:1036F00033A8002585853D9802F04CFC02480575ED +:10370000204601F089FAC0467C1800208E04000093 +:10371000201D0020800140000300008000180020D0 +:1037200054670000F0B581B000900B0901221340EE +:103730005B42194C1C40CD0815406D42174E2E407F +:103740004701774067404C091440644214482040C8 +:1037500078408E0916407642124F37404740C809DC +:1037600010404042104A02407A4098272F40009D66 +:10377000ED0E49012943C9B2794079251D404D40DC +:10378000F32121406940AE2333404B401E210140CC +:103790005940104601B0F0BDE2996DB7618EBCF2A0 +:1037A000C4B35F3EA8E2AB2E70E4434FF0B581B0E6 +:1037B00015460E4607463C78012000210090FFF791 +:1037C000B1FF002C12D07F1C1F22224042403C78C7 +:1037D0001046FFF7A7FF7F1C002CF5D106E0FFF78E +:1037E000A1FF0246307850406D1E761C002DF6D1A8 +:1037F0000824FFF797FF641EFBD1009A504001B0E8 +:10380000F0BD000070B514460A4601460D487844E4 +:10381000FFF7CCFF23220546D54020239E1A0B46F6 +:10382000B3402B431646203E0D46F540002E00DAED +:103830001D461F232B402370531F641C002A1A4669 +:10384000E9D170BD4E560000F0B599B01D46034653 +:10385000002017901690107014296FD11E99002027 +:10386000002904D0012969D10192082000E00192C9 +:103870000CAF3870781C1422194601F098F9152104 +:103880000026324630463B78000218431346083380 +:103890007F1C491E0224E443A2420EDB0D32134674 +:1038A0000A3B0446DC401F23234002ACA355521FB1 +:1038B000761C092AF3DC521F00E01A460029E2D1E7 +:1038C000002A019F07D00521891A88401F21014045 +:1038D00002A88155761C02A816AA3146FFF792FF6E +:1038E0000020002E394611D002A801780023144A86 +:1038F0007A44202920D2581CAB421DD202ACE45C91 +:10390000145DFC54B0420346F3D3391800220D4B2A +:103910007B4416AC2478202C0ED28418641CAC4254 +:103920000AD816ACA45C1C5D8C54521C082AF0D337 +:1039300000238B54801801E00020387019B0F0BDCE +:10394000785500005855000070B594B014460A46EA +:10395000014601A8FCF771FB01460020002912D0A6 +:1039600001A8027800216B461960011D21250CAECB +:103970002846334602F074FA202228463146234670 +:1039800002F01AFA012014B070BDF0B59DB01446D3 +:1039900013AAFFF7D9FF0025002811D021266F4672 +:1039A00013AA0125304639462B4602F015FA08378E +:1039B0003846FEF757FB20463946324601F0F7F805 +:1039C00028461DB0F0BD0000F0B58BB00746119C35 +:1039D000012F17D0129E032F12D1212205AF0846C6 +:1039E00011463A46FEF763FF00256846056014213C +:1039F000384622463346FFF727FF002836D136E007 +:103A0000022F25D10393049405A8142545700024A2 +:103A10000470861C2122084611463246FEF747FFF5 +:103A2000022F0DD11099002908D0684605600022A8 +:103A30000498334602F0BCF8002817D1002516E0A0 +:103A40006846039912C005A816219623049D09E033 +:103A500025460024684614C00648301883B2212247 +:103A6000084611462A46FEF751FF2C5401252846E8 +:103A70000BB0F0BDFFFF000070B59AB00E460446D3 +:103A80002069002500282AD0217BA068401CFF3136 +:103A9000C9B211AA00252B46FFF777FF00281ED0D8 +:103AA000F388B288A0680078716B33256E46B560E4 +:103AB00004AD22C611A9FFF787FF002500280ED00C +:103AC000246904AD284605F09BF8421C284621468F +:103AD00004F04EFF01250021002800D00D462846A5 +:103AE0001AB070BDF0B585B00A4606460020B07326 +:103AF00034460E34317B082927D803AF00210191C9 +:103B00000825384602922A4601F067F8327BA81A47 +:103B10003818B16801F04BF8029D2735284605F0AA +:103B20006FF8C6B220462946324601F040F8202000 +:103B3000A055A019421C0298416C3846FEF758F96E +:103B40003018201801994170012005B0F0BD000027 +:103B500070B598B004466D466021284604F0F2FE28 +:103B6000A16928461C30402205F0ACF85C20295C95 +:103B70000020002917D1227B082A14D8267D082E80 +:103B800011D86D46A81A1430A16804F0E1FEA81BF4 +:103B90001C302169324604F0DBFE044860222946CD +:103BA00004F0D6FE012018B070BDC04600180020F9 +:103BB00010B50C490860FEF7E5F9252040010A49D7 +:103BC00001240C5401F062F92102084804F0BAFE05 +:103BD000002003F03FFE204603F03CFEFCF7FEFA17 +:103BE00010BDC046201D00207C180020241D002090 +:103BF00080B506480078002801D104F089FC04490A +:103C000079440020024604F031F880BD241D0020D4 +:103C1000A457000080B582B001900648784401F0B6 +:103C2000FFFE293001A9012202F05AF8FFF7E0FF58 +:103C300002B080BDA061000001460020022903D827 +:103C400088000249794408587047C046BC560000B5 +:103C500080B5012805D0002807D10020FFF7DAFF42 +:103C600080BD0120FFF7D6FF80BD002003497944C5 +:103C7000034A7A4404F046FC80BDC04613000000AD +:103C80002700000001460020012903D888000249CE +:103C9000794408587047C0467C56000080B500281B +:103CA00002D0FFF7A5FF80BD0648784401F0B8FEBA +:103CB0002921435C002004497944044A7A4404F0F1 +:103CC00003FC80BD126100007DFFFFFF91FFFFFF3D +:103CD00080B5002003497944034A7A4404F012FC79 +:103CE00080BDC046ABFFFFFFBFFFFFFF80B5FF20D9 +:103CF00002F010F980BD80B50120FCF7FBFDFFF755 +:103D000077FF80BD80B50020FCF7F4FDFFF770FF62 +:103D100080BD80B50120FCF7EDFDFFF769FF80BD98 +:103D200080B50020FCF7E6FDFFF762FF80BD80B59F +:103D30000020FCF7DFFDFFF75BFF80BD80B50120B1 +:103D4000FCF7D8FDFFF754FF80BD80B50020014689 +:103D5000FDF746FCFFF74CFF80BD80B50120002138 +:103D6000FDF73EFCFFF744FF80BD80B50020FCF767 +:103D7000C1FDFFF73DFF80BD80B50120FCF7BAFD16 +:103D8000FFF736FF80BD80B50178490601D001F00C +:103D9000F3F880BDB0B5054607202840002401286F +:103DA00014D0022814D1002909D00B4802F0BEF823 +:103DB00068B200280ADA01F089FF002406E0FF213A +:103DC00052310548002202F0C9F804462046B0BD31 +:103DD000022000F021FFC046E81F0020F0B581B0AE +:103DE000E04D28780C2810DD0D286CD00E2800D16D +:103DF000C7E015280FD1DC48807901280BD1A879BC +:103E0000000708D4102000F007FF052800D111E1B9 +:103E10000C2800D181E2D54C00276760012020707A +:103E2000204602F047F8042002F0C0F860606928DC +:103E300000D05DE101F044F801F044F8BE25F84EF1 +:103E40007753042002F0B2F86060002800D164E2E9 +:103E5000972800D161E2C0243059002800D15CE2EB +:103E6000705BAA27C421715C80B2884200D354E2FF +:103E700002F068F8002800D04FE201F0E5FFB842F8 +:103E800004D102F00BF8B84200D046E23059715B21 +:103E900049014018CC217158002902D088470028D8 +:103EA0000AD0012803D13059715B490140180178CB +:103EB000490601D001F060F8705B401C7053315925 +:103EC0000029CFD129E2D54C00276760012020705E +:103ED000204601F0EFFF042002F068F8606000283F +:103EE00000D11AE2972800D117E2692800D099E1A1 +:103EF00000F0E6FF00F0E6FFBE25C94E7753042030 +:103F000002F054F86060002800D106E2972800D142 +:103F100003E2C0243059002800D1FEE1705BAA27DB +:103F2000C421715C80B2884200D3F6E102F00AF845 +:103F3000002800D0F1E101F087FFB84204D101F080 +:103F4000ADFFB84200D0E8E13059715B490140183B +:103F5000CC217158002902D0884700280AD00128B6 +:103F600003D13059715B490140180178490601D0ED +:103F700001F002F8705B401C705331590029CFD119 +:103F8000CBE1EA4D00276F6001202870284601F040 +:103F900091FF042002F00AF804466C60692C00D0FE +:103FA000E6E000F08DFF00F08DFFBE24E04E3753B9 +:103FB000042001F0FBFF6860002800D1ADE19728E4 +:103FC00000D1AAE1C0257059002800D1A5E1305BDD +:103FD000AA27C421715C80B2884200D39DE101F020 +:103FE000B1FF002800D098E101F02EFFB84204D1C3 +:103FF00001F054FFB84200D08FE17059315B4901A4 +:104000004018CC217158002902D0884700280AD0D6 +:10401000012803D17059315B4901401801784906E4 +:1040200001D000F0A9FF305B401C305371590029CA +:10403000CFD172E1BD4C002767600120207020467F +:1040400001F038FF042001F0B1FF6060002800D1CA +:1040500063E1972800D160E1692800D018E100F001 +:104060002FFF00F02FFFBE25B14E7753042001F043 +:104070009DFF6060002800D14FE1972800D14CE1FE +:10408000C0243059002800D147E1705BAA27C42121 +:10409000715C80B2884200D33FE101F053FF0028F9 +:1040A00000D03AE101F0D0FEB84204D101F0F6FEB2 +:1040B000B84200D031E13059715B49014018CC2140 +:1040C0007158002902D0884700280AD0012803D15E +:1040D0003059715B490140180178490601D000F060 +:1040E0004BFF705B401C705331590029CFD114E154 +:1040F000C0258F4C6059002800D106E1BE26A05B88 +:10410000AA27C421615C80B2884200D3FDE001F09F +:1041100019FF002800D0F8E001F096FEB84204D163 +:1041200001F0BCFEB84200D0EFE06059A15B49014C +:104130004018CC216158002902D0884700280AD0B5 +:10414000012803D16059A15B490140180178490653 +:1041500001D000F011FFA05B401CA0536159002961 +:10416000CFD1D2E0241E00203C210020501F00208F +:10417000D8206F4D2958002911D0642264290B469C +:1041800000D31346CA1A2A50D421002A07D16958ED +:10419000002904D0DC22AA582A5000208847002C8D +:1041A00000D1BAE0972C00D1B7E0C02428590028EC +:1041B0002FD0BE26A85BAA27C421695C80B28842A2 +:1041C00027D201F0BFFE002823D101F03DFEB84206 +:1041D00003D101F063FEB8421BD12859A95B490104 +:1041E0004018CC216958002902D0884700280AD0FD +:1041F000012803D12859A95B4901401801784906D3 +:1042000001D000F0B9FEA85B401CA8532959002931 +:10421000D2D1C420285CBE21695A7AE0501F002008 +:10422000241D0020C025424C605900286DD0BE26B8 +:10423000A05BAA27C421615C80B2884265D201F0EC +:1042400081FE002861D101F0FFFDB84203D101F0E9 +:1042500025FEB84259D16059A15B49014018CC21D3 +:104260006158002902D0884700280AD0012803D1CC +:104270006059A15B490140180178490601D000F05E +:104280007BFEA05B401CA05361590029D2D13CE0C9 +:10429000D020274C2058002803D0E978490800F0A6 +:1042A000AFFEC025605900282FD0BE26A05BAA27EC +:1042B000C421615C80B2884227D201F043FE00280D +:1042C00023D101F0C1FDB84203D101F0E7FDB842AE +:1042D0001BD16059A15B49014018CC2161580029CC +:1042E00002D0884700280AD0012803D16059A15B79 +:1042F000490140180178490601D000F03DFEA05B5D +:10430000401CA05361590029D2D1C420205CBE2199 +:10431000615A814201D301F015FE01F013FE00281D +:1043200001D100F081FC012001B0F0BD501F002040 +:10433000241D0020F0B5A5B01E4614460F460546C4 +:10434000FEF7BAF9002807D0A74979440A22204687 +:1043500004F0FEFA25B0F0BD0494A14800684024A2 +:10436000005D112844D128463946FEF704FA03902F +:104370009B480068005D11283AD128463946FEF76F +:10438000BDF9002812D07B208000039C002C07D0B0 +:104390009449085C002803D0083D2846FDF77EFEBE +:1043A000002C04987ED0924979447DE08C480068C6 +:1043B000005D11281CD128463946FEF7D7F90028A0 +:1043C00016D07B2080000399002907D08549085C1E +:1043D000002803D028460838FDF760FE2C78FD2C15 +:1043E0007F4F64D16878A97809020143C81C5FE057 +:1043F0002846FDF767FF002810D079480068406B19 +:104400000028A7D001F00CFB0146A8786A4610608E +:10441000EB1C0022049801F0CBFB9BE7704F38683F +:10442000C4882846FDF7C8FE0321002802D038685A +:1044300084880421200A04D005AA54701070022731 +:1044400002E005A80470012705A8C0196918142501 +:1044500003902A4600F0ABFBFF20EA306149085C7C +:10446000002810D05E480068C288012000219442D4 +:1044700000D008466946086014210398049A334620 +:10448000FFF7E2F966E7012069460C6048602F43B8 +:10449000B9B2B3B205A8049C2246FEF737FA002150 +:1044A000215457E75149794404F0A2FB52E7601CBC +:1044B0002918153920AE1422304604F049FA307814 +:1044C00000281CD0002020A94E4A7A440B781C09F1 +:1044D000145D05AD2C542C180F251D40535D6370E1 +:1044E000491C801C2928F1D3282005AB0021195430 +:1044F0004121454A7A44049801F0BEF82AE7032096 +:104500000121FD2C00D00846295C4018295C411887 +:10451000039800280CD0685C0818401C295C00290E +:104520000AD04C2909D1291849784018801C04E088 +:1045300068184078891C09E0401C291849784018FF +:10454000801C295C0818401C295C491C08182A5C3E +:10455000411C4C2A00D001466C186078A1780902F1 +:104560000143E078227912020243100408431F90AD +:104570001FA820497944042204F070FB00280DD0C4 +:104580001FA81E497944042204F068FB002800D0CB +:10459000E0E61B4979440B220498D9E63D68287966 +:1045A00019AE307021461131701C15273A4604F0BF +:1045B000CFF9A88801216A4603C205AD50233046D1 +:1045C00039462A46FEF7A2F9002129544420205CEE +:1045D000694608604121084A7A4404982B468BE7D3 +:1045E000201D00207C1800206A530000BC4D0000F4 +:1045F000A94E0000F84C0000994C0000084D000046 +:104600002C510000C74D0000AE4D0000F0B597B032 +:1046100001AD50242846214604F094F94548464F00 +:10462000391815A80822FEF7B0F9444838187B213C +:1046300089002A462346FFF77DFE414E4022304640 +:10464000294604F03FFBA3208000385C142811D1D8 +:104650003C48381840497944042200F0C7FA002841 +:1046600008D1394838183D497944042200F0BEFA8F +:1046700000282FD0354C374626682736304604F0C0 +:10468000BFFA02463D4641352846314600F08FFAD2 +:1046900026682736304604F0B3FA202129543046E4 +:1046A0003E4604F0ADFA2818401C83218900224AB6 +:1046B000505015A8FDF756FC05462068273004F039 +:1046C0009FFA2818401C3018412100224254012032 +:1046D00017B0F0BD1E48381801210022FDF702FF77 +:1046E0000346304641301F2B06D0032B07D0012B49 +:1046F0000BD11B49794404E01A49794401E01A4975 +:104700007944062204F024F904E01421174A7A447B +:1047100000F0B2FF35464135284604F071FAC4B2C4 +:1047200028198321890078500A483818FDF71AFCA7 +:104730002018C8E7820200007C1800208A020000CE +:10474000001800208D02000091020000201D0020B2 +:1047500095020000990200005D4C000063500000CB +:10476000C44B0000C44B0000C44B0000BC4B000015 +:1047700070B58CB020206946486004AE0E600C48CD +:1047800094300C4D2A46413201240023214601F089 +:10479000C3FA6846082306601836436086604121E4 +:1047A000054A7A44284600F067FF20460CB070BDE9 +:1047B0007C18002000180020374B000010B5252081 +:1047C00040010D4C215C0020002900D010BDFFF7F6 +:1047D0001DFF8F20C000205808496158491C0B1A42 +:1047E000074855301421074A7A4400F045FFFCF78A +:1047F0007BFC012010BDC0467C1800207C0400001A +:1048000000180020FD4A0000B0B582B0252040010C +:10481000164D285CA97F01430024002902D02046C0 +:1048200002B0B0BD12482A18294615316846FEF775 +:1048300040FA0028F3D00F48285C01240328EED169 +:1048400000206877F52040003D21C900695C0029FF +:1048500007D0295C002904D101242C54002028759C +:10486000DDE70A2028750124D9E7C0467C1800201E +:10487000850400008404000080B5FFF779FF012063 +:10488000FDF7F8F980BD000010B5044604497A220E +:10489000FEF762F900212046FEF7C8F810BDC046B9 +:1048A0000018002010B5074CC834204604F0A8F9C1 +:1048B000202121542018002141700120FCF71AF812 +:1048C00010BDC046E81F002080B503497944002090 +:1048D000024603F0CBF980BD544B000080B503497C +:1048E00079440020024603F0C1F980BDB04B0000BE +:1048F00080B505497A22FEF72FF904497944002052 +:10490000024603F0B3F980BD00180020384C0000C7 +:1049100080B505497A22FEF71FF904497944002041 +:10492000024603F0A3F980BD00180020C44C00002B +:1049300080B5034979440020024603F097F980BD11 +:10494000684D000010B58CB06C46204604F036F976 +:10495000A0850D49084206D1684601F01BFB0A906C +:10496000FF2001F0D7FA01F009FB6946884202D125 +:104970000A9801F00FFB6846808D002801D10CB029 +:1049800010BD00F049F9C046FFFF0000F0B59FB030 +:104990000446002C2FD10DAC00264822204631467B +:1049A00000F01BF9032525720D9633480E90204622 +:1049B0000930344979440526324603F0C9FF2046C0 +:1049C0001730314F7F443946324603F0C1FF20464D +:1049D00027303946324603F0BBFF26462D362B4999 +:1049E000794430462A4603F0B3FF40201121215478 +:1049F0001A9604201E9021480460214C01200102D7 +:104A0000204603F09FFF01AD284604F0D7F8A885A3 +:104A100085B2002D0BD001A8002181850B9801F0F3 +:104A2000B9FA0B9801F0B6FA102DE7D01FE001ADEE +:104A3000284601F0AFFA0B9000F028FAFDF7A2FA31 +:104A4000002002F007FF012002F004FFFFF7D0F87A +:104A5000FBF7C4FB01F092FAA84202D10B9801F0D7 +:104A600099FA01A8808D0028C8D000F0D5F8FFF78A +:104A700069FF1FB0F0BDC04678006E00201D002009 +:104A8000241D00203C490000314900001A49000063 +:104A9000F0B59FB00446A068002831D10DAD0027C5 +:104AA00048222846394600F098F8032000902872E2 +:104AB0000D9737480E902846093037497944052725 +:104AC0003A4603F045FF28461730344E7E443146BF +:104AD0003A4603F03DFF2846273031463A4603F078 +:104AE00037FF2E462D362E4979443046009A03F082 +:104AF0002FFF4020112129541A9604201E90A560F2 +:104B00000027244E01AD284604F058F8A88530420D +:104B100007D101A801F03EFA0B90F8070FD001F081 +:104B2000D5F901F02BFA01A9884202D10B9801F0C6 +:104B300031FA01A8808D002828D10127E2E70A2058 +:104B400001F0B8F86068022817D004280BD00328B9 +:104B5000E5D1E06800218161A168E068FEF78CFF83 +:104B6000E1688861DBE7E0680021C162A168E06874 +:104B7000FEF7B8FFE168C862D1E7E068FEF7E8FF3A +:104B80000028CCD0A068FFF713F8C8E700F044F87D +:104B900078006E00FFFF0000344800002948000044 +:104BA0001248000080B5002001F0F4F980BDB0B5D6 +:104BB000884208D9002A0FD0491E401E8B5C8354BE +:104BC000521EFBD108E0002A06D000239CB20D5DE6 +:104BD00005555B1C521EF9D1B0BD80B50B46002AAD +:104BE00003D011461A4603F0BBFE80BDB0B50023CA +:104BF000002A0FD0401E491E8C5C855C521EA542C7 +:104C000002D1002AF8D105E00020C0430123A542CB +:104C100000D80346D8B2B0BD10B5044601F0AEF9D5 +:104C2000214603F0D7FF000080B501F08BF9002882 +:104C300000D080BD0648002141706022027002222F +:104C40008270C1700171052101F070F980BDC0460C +:104C5000241E0020B0B51A48C078032807DC0128BC +:104C60000DD0022828D1174802F073F9B0BD0428EE +:104C70001FD0082820D1134802F069F9B0BD114CAB +:104C80000121204602F05EF9204602F03DF90E4C6B +:104C9000A079002811D120460C3000250422294695 +:104CA000FFF79BFF1034082220462946FFF795FFA7 +:104CB000B0BD044802F049F9B0BD1020FFF7ACFFC9 +:104CC000241E0020FC2100203C2100207F210140E7 +:104CD0000020032903D8C8B201490818007B704797 +:104CE0003C21002080B516480179042918D00229FA +:104CF00006D0012922D1811D134802F00DF880BD94 +:104D0000C2787F211140032918D8C9B24A000D4B3F +:104D10009A1800231382821D0B4802F082F880BD8E +:104D2000C2787F211140032908D8C9B2054A521818 +:104D300043791373821D044802F01CF880BDC046FD +:104D4000241E00203C210020FC21002070B51546C7 +:104D50000E460446FF2D1BD80E485021017020211D +:104D600001714571E91C817080222243C270090AD9 +:104D70004170062101F0DAF83046294601F0D6F8F4 +:104D80007F2020404000044908187D21090101824C +:104D900070BDC046241E00203C21002080B50A467C +:104DA000014682201423FFF7D1FF80BD80B50A465B +:104DB000014683201423FFF7C9FF80BD80B50C484E +:104DC0000178002900D080BD062181710A2101707F +:104DD00008498B784A7812021A43FF232A339A42F1 +:104DE00000D31A464280C91C0348FFF7E0FE80BD8D +:104DF0003C210020241E0020E81F0020B0B52048E0 +:104E0000827841780902114300780F280ADC0E28C5 +:104E100010D00F2823D10020012927D1FFF71AFF36 +:104E20000120B0BD10281ED0162818D1FFF7C6FFEC +:104E30000120B0BD13488168643181601621124A97 +:104E4000435A002B08D06424642B1D4600D325460A +:104E50005B1B435213420ED0891E0E29F0D1022053 +:104E6000FEF7BCFFB0BD0020032900D2B0BDFFF7A4 +:104E700039FF0120B0BD002101701020FFF7CCFEEA +:104E8000241E00203C210020FFFF0000B0B50A20B6 +:104E900000F010FF084C0025182220462946FFF795 +:104EA0009CFE65802570A571A56000F061FB03483C +:104EB00005604560B0BDC0463C2100205421002063 +:104EC0007047000002480021016041607047C04601 +:104ED00054210020F0B589B00546084600F0A0FD39 +:104EE0000446002C43D02069002840D0284600F01A +:104EF00097FD014602AD1C2228460192FFF757FE9E +:104F00002168E98062682A81A0681A4F65233B7096 +:104F100089B292B24A434243D1084E1C07231A4237 +:104F200000D10E46314600910426864070181D308F +:104F3000B870000A78700321384600F0F7FF284661 +:104F4000019900F0F3FFA06838700121384600F0A5 +:104F5000EDFFE06800F064FDB1B200F0E7FF0098FB +:104F600085B2206900F05CFD294600F0DFFF09B042 +:104F7000F0BDC046241E002070B500F051FD04466F +:104F800020787F26064000F0DDFF002830D1002E7B +:104F90002ED0E06900281DD000F042FD0546052E08 +:104FA00002D1A07E002824D0284603F029FE064620 +:104FB00012486521017031461C318170090A417027 +:104FC000032100F0B3FF1C21204600F0AFFFB1B277 +:104FD00028460BE0094800214170652101701C251D +:104FE0008570032100F0A2FF2046294600F09EFFB5 +:104FF00070BD20462946FFF76DFF70BD241E0020BE +:1050000070B50446002C28D01448066845688E42C6 +:1050100001D16D1C45600E43002902D00660324666 +:1050200005E00022026042600D4B5B1C1E438A4279 +:1050300001D000214160082D0CD30321284603F044 +:1050400091FB012290073043002900D03046D10760 +:10505000884300E030462946A04770BD5421002017 +:10506000FFFFFF7FF0B581B00F4E01243470B11CFB +:10507000FF2750377A1C204600F03EFF054675702A +:105080007A1B7719F91C022000F036FFB8702D1832 +:105090007619F47000F024FF3071902070710020B8 +:1050A000B071E81D01B0F0BDE81F0020F0B58BB075 +:1050B0000A46064607210E4207D03346D8B291B2BF +:1050C000FEF768FE80B20BB0F0BD4B208400832059 +:1050D0000390AA4DA84F3346019109E06920A949E0 +:1050E00008700398801C487002220199079B2DE1EB +:1050F000102130460840049292B20592002A06968A +:1051000000D1B5E0002800D0B2E0079300910290F2 +:1051100007E0A1B20022384600F020FF012000F095 +:105120003FF900F00FFF0028F3D17D200001A968AE +:105130000E1828780928079A42DC072848D0092841 +:1051400063D100218E48079101F0F8FB10E0FFF7D2 +:105150006BFDA1B20022384600F000FFA868B04203 +:1051600000D3FEE0FFF74AFE00F0ECFE0028F0D18D +:10517000834801F039F90028E9D0059AD01D40088C +:10518000A92800D3F3E003980D307E4B985498186B +:1051900007994170581D0499891C8AB205921946D5 +:1051A000FFF705FD052277480799FFF716FD0598DB +:1051B000401D83B272480399724A01F0D3FB3FE06D +:1051C0000A2804990AD00B2822D17148784401E0BA +:1051D0006E487844059900F035FA31E020462530D4 +:1051E00080B2059E864200D9C1E053203870B97064 +:1051F000080A78700321384600F098FE614831466D +:1052000000F094FE002028701DE0002800D1ABE0E3 +:10521000D0B20599FEF7BEFD002811D0A4E0FFF73B +:1052200003FDA1B20022384600F098FEA868B04203 +:1052300000D396E0FFF7E2FD00F084FE0028F0D1F5 +:1052400028780028EBD10020A87128706880069E7D +:10525000B10600D536E7FFF7E7FC30060298009963 +:1052600006D5089108AA484B1846114601DF029856 +:10527000002804D170066ED40020A8712870002088 +:10528000688000F05FFE002801D1FFF7CDFCA1B2DD +:1052900000223846079200F061FE022806D8B9784D +:1052A0007A7812020A43D11C81423DD1FFF7A6FD54 +:1052B000688829780029E4D00028E2D0354979446B +:1052C0000422304E3046FFF791FC00282ED03249A0 +:1052D000794404223046FFF789FC00282BD02F495F +:1052E000794404223046FFF781FC002837D1039827 +:1052F0002730C6B200F0D2FDB04200D0EEE6012069 +:10530000204E3070B01C402100F0BAFD7070811C3E +:10531000184A121D1140039B0D337354C11C1140D8 +:1053200000237354021D10E00020A7E7FFF79AFE48 +:105330000246002309E00020707003980D303070A1 +:1053400080200699014302220B460199DEB20B42EE +:1053500000D1CDE6B2E6688806494018B2E6688812 +:10536000B0E61020FFF758FC0920FFF755FC02209B +:10537000FFF752FCFBFF0000241E00203C21002010 +:105380005C210020E81F0020BE9A0060C7FBFFFFE1 +:10539000DDFBFFFF1244000005440000FA4300005B +:1053A00070B5044600F0CEFD002801D1FFF73CFCAB +:1053B0004B2081000B4E002530462A4600F0CEFDE2 +:1053C0003078152806D8012181400748014201D0D4 +:1053D000002C05D1FFF712FD0125002800D105465C +:1053E000284670BD241E00202070200010B5FFF755 +:1053F0001BFC084C4B2081000022204600F0AEFD33 +:1054000020780E2801D0FFF7F9FC00F09BFD002862 +:10541000F0D110BD241E0020F0B581B000920F46DF +:1054200004464B4EB74210D0494D00214026284635 +:105430003246FFF7D2FB00984028024600D332469E +:1054400028463946FFF7B3FB414EB07801280ADC05 +:10545000002828D0012869D1F01C042100F04EFC5E +:10546000402130462BE0022827D005285ED1307934 +:10547000F17809020143374C2068002781425BD153 +:10548000206800281ED03448009D2918334A13682C +:105490006D1FADB2AB4200D21168051D0D40304802 +:1054A0000068711D34E0F01C002704223946FFF724 +:1054B00094FB40213046A0473EE025484021A047CC +:1054C000002739E0B079717909020143254801606C +:1054D00001684908A8292FD801682048016071781F +:1054E000327812020A4320490A601D491F4A0A60A5 +:1054F000009D691F8AB218495218D21C0368ED1F1B +:10550000ADB2AB4200D202680D1D1540F11D174827 +:105510002A46FFF74CFB11480168491B01601048FF +:105520000168491901602068401C20600B4801682F +:1055300001200227002907D1064800210160084800 +:105540000160064801603846C0B201B0F0BDC046F7 +:10555000A0210020E0210020FBFF0000E821002026 +:10556000EC210020E4210020F0210020E81F002091 +:10557000034800210160034801600348016070474F +:10558000E0210020EC210020E8210020F0B581B0CE +:10559000264F3A68264C2168002921D0002A1FD0C6 +:1055A0000090264D002140222846FFF716FB0520DB +:1055B000A87023480168090A2970006868701D49AD +:1055C0000868000AE87008682871096820680029DE +:1055D0000ED03B263B2800D826683968681D12E0AB +:1055E00014480021016039601348017021601BE0FC +:1055F0003926392800D826682068000A6871206892 +:10560000A8713968E81D3246FFF7D1FA009A0949B6 +:105610002068801B20603868801938600868401C4A +:10562000086006484021904701B0F0BDEC21002001 +:10563000E8210020E02100203C210020A0210020C2 +:10564000F021002080B500290BD0064A002313600A +:10565000054A1160054A064B1360064A1160FFF7C0 +:1056600095FF80BDE0210020E8210020EC210020F2 +:10567000E81F0020E421002081B0F0B58EB015466F +:105680000C4606901393022C00D2BAE1069800282B +:1056900000D1B6E1002D00D1B3E10698214603F018 +:1056A00051F913A809902978002900D1A9E1671EB2 +:1056B000002602E0A8194178761CC8B2002801D063 +:1056C0002528F7D1BE4200D33E46069C20462946F7 +:1056D000324603F041F9BF1BA4190694002F00D1F4 +:1056E0008FE1A95DAD19252900D087E16B1C002051 +:1056F00020210A220892049005900790044608464B +:1057000004E009990A1D0992096804911D46224680 +:1057100029786D1C00242D29F9D0472918DC2F2960 +:1057200026DD0B46303B0A2B00D366E130290446C8 +:1057300000D10C46079B002B00D004460A23079893 +:1057400043435818303807902B4620461446DDE76F +:10575000672904DD722921DD73293AD122E062290B +:105760003CDC48294BD1014601200590084617E052 +:10577000252958D02A2926D02E2900D03DE1297884 +:105780002A2900D03AE16A786B1C01242A21482A90 +:10579000B7D0682AB5D0732AB3D02FE1682936D1A3 +:1057A0001021089109990B1D0993032313400968DF +:1057B000012B00D1BBE0022B00D1BAE0032B2B461A +:1057C0001446A3D0C6E02978022473292B4698D02A +:1057D00014E1752929D078291CD00EE1632900D164 +:1057E0009BE0642900D008E1029003970998011D0D +:1057F00009910068C11742184A40C00F1CE058299F +:1058000000D0FAE0014601200590084602E0702928 +:1058100000D0F2E0029003970998011D09910268F7 +:105820000020102709E025207BE0029003970998CB +:10583000011D0991026800200A270124974208925D +:10584000049012D8012638460446394602F004FF77 +:10585000B04209D1384660430799491E079108991B +:1058600088422646F0D900E034460798411E049B42 +:10587000002B00D107990026F243002B029800D19B +:105880001A460192C2B2302A06D1002B04D00AA8CF +:105890002D23037000230126881E0D280BD80AA88B +:1058A0003043491E049303F05BF8049B079880196A +:1058B00001994018461E002B03D00AA82D218155BE +:1058C000761C0598002C1AD0002802D05348784442 +:1058D00001E05148784407900898214602F0BCFE48 +:1058E000394602F03FFF0798405C0AA988552046D8 +:1058F000394602F0B1FE761CA7420446ECD9039F5C +:10590000BE4200D33E460AA9069C2046324603F01A +:1059100023F8BF1BA41906946DE00998011D099195 +:105920000068069908707F1E491C069163E0049E7A +:1059300016E00878002860D10499B94200D33946AE +:105940002022069C2046049103F00AF804983F1A8E +:1059500024183DE000228B5C521C002BFBD1561E0C +:10596000089810282AD1002E47D000243B46085D15 +:105970000F2202400009022B1F4642D3059B002B39 +:1059800005D0012B0ED10794224B7B4402E00794F3 +:105990001F4B7B44D2B29A5C069C6270C0B2185C0A +:1059A0002070079C3846871E02282AD0641C06985F +:1059B000801C0690B4423B46D9D30DE0BE4200D3D2 +:1059C0003E46069C2046324602F0C6FFBF1BA41985 +:1059D0000694002F079C14D0B4420ED9A41BBC42DD +:1059E00000D33C462022069E3046214602F0B8FFF6 +:1059F0003F1B36190696002F03D02978002900D0C6 +:105A000056E600200EB0F0BC02BC01B00847C0460C +:105A10004D3D0000653D00000B3E0000213E0000B2 +:105A200080B50449884204D30349884201D200F07A +:105A300005F880BD0000D0C0009ED0C07A46024963 +:105A4000C91C891A401A70473D5AD0C010B541018F +:105A5000104A0A40430E01210B405B420E4C1C4091 +:105A60005440820E0A4052420C4B13406340C20E17 +:105A70000A4052420A4C14405C40020F0A40524213 +:105A8000084B13406340400F08404142064808401D +:105A9000584010BDE0FFFF3FB2576A3B6D8E502665 +:105AA000FA19A11EDD33423DB362142AF0B587B066 +:105AB00005930492064602910D7800270120002DDF +:105AC00003971BD00298401C0690012000272C460B +:105AD000019721464139E2B2202A5FD3C9B21A297F +:105AE0005CD3FFF7B3FF01460698C25DE020044097 +:105AF000600948407F1C002A1446EAD10599C9195B +:105B0000C91D5A2903994CD8FFF7A0FF002D0ED0CC +:105B100002994C1CFFF79AFF014635701F20284060 +:105B20004840611C761C2578002D0C46F2D13121AD +:105B30003170711C06910599002914D000241A4E69 +:105B40007E44039404990F5D1F2F29D8F55DFFF75C +:105B50007DFF06990D557840641C05998C42F1D360 +:105B60000699091906910624FFF770FF641EFBD100 +:105B70000121484019220D497944069B0446D4402E +:105B80001F2525404C5D1C70541F5B1C002A2246BB +:105B9000F4D1002006998871012102E0019900E00A +:105BA0000399084607B0F0BD28330000F03200002A +:105BB000F0B595B00C46054600200390102A1EDC77 +:105BC0001A99002A03D08E1E262E04D917E0142914 +:105BD00001D0202913D104AE327001206A46082773 +:105BE00082C21060701C03A9052200F00AF8039815 +:105BF000431C0393284621463246FFF757FF15B052 +:105C0000F0BDF0B587B0049301910546104601231D +:105C100083405C1E00270E9900910D9902910C9A09 +:105C2000002A3E4627D04142059100263746029978 +:105C300076188F4004990B781F43491C0491521E1B +:105C400003928642069712DB01990B6802462046B2 +:105C50005C1C0C60059CA4192F46069DE54004467B +:105C600010462540FD543D46361A8642EDDA039A29 +:105C7000002A069FDBD1009900290CD0002E13D0FA +:105C800001990B68024620465C1C0C60911B8F40FA +:105C90000740EF5408E0811B8F4027400021029805 +:105CA000864202DA002F00D10121084607B0F0BD7C +:105CB00001DF704780B584B00190034801A9FFF768 +:105CC000F7FF04B080BDC0463701006080B582B0E8 +:105CD00002486946FFF7ECFF02B080BD3C0200605D +:105CE00080B586B0019002910392034801A9FFF7A5 +:105CF000DFFF06B080BDC0467F03006080B584B082 +:105D00000090019103486946FFF7D2FF019804B063 +:105D100080BDC0462C05006080B588B00090019120 +:105D2000029203930A9804900B98059003486946E1 +:105D3000FFF7BEFF019808B080BDC0463B0700607A +:105D400080B584B00190034801A9FFF7B1FF029824 +:105D500004B080BD7F08006080B584B00190034826 +:105D600001A9FFF7A5FF029804B080BDDB0A00601F +:105D700080B586B000900191029203930348694672 +:105D8000FFF796FF019806B080BDC0462C0B00605F +:105D900080B588B000900191029203930A98049014 +:105DA0000B98059003486946FFF782FF019808B0F9 +:105DB00080BDC0462B1A006080B586B0009001916E +:105DC0000292039303486946FFF772FF019806B0F9 +:105DD00080BDC046EA2E006080B586B0009001917B +:105DE0000292039303486946FFF762FF019806B0E9 +:105DF00080BDC0462E2F006080B58AB00090019112 +:105E0000029203930C9804900D9805900E980690BA +:105E10000F98079003486946FFF74AFF01980AB0B8 +:105E200080BDC046F338006080B586B00190029115 +:105E30000392044801A9FFF73BFF029880B206B025 +:105E400080BDC0466E92006080B582B0034869464E +:105E5000FFF72EFF0198C0B202B080BD4F9F0060D7 +:105E600080B588B001900291039204930A9805903E +:105E7000024801A9FFF71CFF08B080BDBA530060BB +:105E800080B584B00090019103486946FFF710FF88 +:105E9000019804B080BDC046FCA8006080B582B007 +:105EA00003486946FFF704FF0198C0B202B080BD05 +:105EB0003CA0006080B584B00190034801A9FFF7C1 +:105EC000F7FE029804B080BD5864006080B582B0CF +:105ED00002486946FFF7ECFE02B080BD8D680060A5 +:105EE00080B582B003486946FFF7E2FE019802B030 +:105EF00080BDC0466E6A006080B586B00190029198 +:105F00000392034801A9FFF7D3FE029806B080BDB3 +:105F1000D474006080B584B00190034801A9FFF7F4 +:105F2000C7FE04B080BDC046BE9A006080B584B094 +:105F30000090019102486946FFF7BAFE04B080BDA7 +:105F40008183006080B582B003486946FFF7B0FEE8 +:105F5000019802B080BDC046BB84006080B586B0A9 +:105F6000019002910392044801A9FFF7A1FE029853 +:105F700080B206B080BDC046E485006080B582B0C6 +:105F800003486946FFF794FE019802B080BDC04601 +:105F9000B187006080B584B00190034801A9FFF784 +:105FA00087FE029804B080BD7588006080B584B01B +:105FB0000190044801A9FFF77BFE0298C0B204B02B +:105FC00080BDC0468B9C0060F0B585B03A4A12781F +:105FD000002A03D083213A4A7A440BE00A9A452AE0 +:105FE00003D88321374A7A4404E0072907D1832163 +:105FF000354A7A44022300F0B5FC05B0F0BD0192A9 +:10600000029040200393185C0490002822D004984A +:106010000528039D08D1284641302C4979440522A2 +:10602000FEF7E4FD002833D041350027284E7E449A +:10603000049C0321384602F00FFB0221C94341436F +:10604000705C297841402970641E761C6D1C7F1C91 +:10605000002CEED145200399085C4630019A90420D +:1060600010D141311548049C2246FEF7A0FD0720BF +:10607000114988714C80092008700121029800F0B4 +:106080005DFCBAE78321134A7A4402230298B2E7FF +:106090000A4D03222A70681C0F497944FEF787FDD8 +:1060A000281D0E4979440422FEF781FD2878431DFE +:1060B000832102982A469EE73C210020E81F002009 +:1060C000293700001D37000013370000EB360000B1 +:1060D000DF3600008E360000733600006D3600009B +:1060E000F0B581B01D460E460446284600F016FC69 +:1060F00000280ED02068C11C090A6A469170811CD4 +:10610000090C5170411C090E1170001D2060D070E7 +:1061100004E0684604222946FEF749FD174F08228D +:1061200038463146FEF743FD3846083069460422BA +:10613000FEF73DFD00207873022139730121B97308 +:10614000F8733874284600F0E9FB0146201D8625C7 +:10615000002906D029467931C9B20422FEF73DFD57 +:1061600003E069460422FEF722FD044A112320467B +:10617000294600F0F7FB01B0F0BDC046E81F002043 +:10618000F0B583B0029088794B791F020743887875 +:1061900001904B780E781546093DACB2A74204D069 +:1061A000D01FD21F92B297421BD13D46002E08D07D +:1061B00083211C4A7A440223029800F0D3FB03B0E7 +:1061C000F0BD022B18DC012B23D0022B1DD1A8B26D +:1061D0006A461060CB1D002202980199FFF7F4FE79 +:1061E000EDE7E4B2A742E1D0D2B297420546DDD056 +:1061F00083210D4A7A44DEE7032B0ED0C12B04D154 +:1062000083210A4A7A440423D6E783210A4A7A443E +:10621000D1E78321064A7A44CDE78321054A7A44AF +:106220000823C9E7703500000F3500001C35000059 +:10623000E9340000FA3400001835000080B5C16967 +:106240008A784B781B0213430A78812A09D0832A63 +:106250000CD0862A0ED1C91C031D0022FFF740FF77 +:1062600080BDCA1C812100F07DFB80BDC91C1A467F +:10627000FFF786FF80BD000070B50D460146012A7C +:1062800011D1094C20462A46FEF791FC60194026A0 +:10629000721B00252946FEF7A0FC812021463246CC +:1062A0002B46FEF753FD70BDA02100200282C16085 +:1062B0000022C282827642858284C1610262704776 +:1062C000F0B583B00D4604462A20215C20462A30D2 +:1062D00001294AD000293BD12B21002262542346B8 +:1062E0002B332027E15DC91EC9B22646203601297D +:1062F0003ED8218BE28A91423CD94020012D00D02A +:1063000038460290A07E03230126002800D03346A1 +:106310000027012D3E4600D12E46B60033431E46CF +:10632000029B9B1B891A1A46914200DC0A4691196E +:106330000291012D08D1211D2A48042701923A46D5 +:10634000FEF735FC019AA07E002820D0FF302BE01C +:106350002521615C062908D12B21625C002363544E +:1063600023462B33002A03D1BBE72B2000212154E5 +:1063700003B0F0BDFCD10021A176E182197001705B +:10638000B1803160E068E06115480170F0E74020BD +:10639000205CB9B2134B58540120384381B2637E5C +:1063A000104F7B54471C207EB9B20E4B5854E16904 +:1063B000002907D01746BAB29819E38AC918FEF720 +:1063C000F6FB3A46E08A1018E082A07E401CA076D8 +:1063D000029881B203482A46FFF74EFFC8E7C0463D +:1063E0003C210020A021002001462A200A5C012037 +:1063F000002A10D0012A01D100200CE025200A5CDF +:106400000020062A07D12B200A5C01200021002A47 +:1064100001D0084670477047B0B52B210124445481 +:10642000011D0B4D04222846FEF7C1FB00206871B8 +:10643000832028710220A8716920E8717C20C04364 +:10644000801C2872092128462246FFF715FFB0BD9F +:10645000A0210020B0B52B2101244454011D084D7A +:1064600004222846FEF7A3FB0020687188212971C9 +:10647000A871072128462246FFF7FEFEB0BDC046A0 +:10648000A0210020F0B581B004462520205C2646DE +:106490002536002505286AD008784B781B0203436F +:1064A0008878CD782D02054328041843237965792F +:1064B0002D021D43A379E7793F021F433B042B4381 +:1064C000834257D108790B1D658C002D13D02423EE +:1064D000E75C23462433B8424CD1278B401C18700C +:1064E0007B1B501F984200DB18464219628482B21F +:1064F000208D491D23E07C25ED436D1DEFB28325E2 +:10650000B84204D12046FFF7A5FF01252FE08F797F +:10651000497909023943C91CA8422BD1208B8DB27D +:10652000A84227D189B2164D24270020E055121F1A +:106530008A4200DB0A466284154019462A46FFF764 +:1065400073FC2085218B628C01258A420FD3E18C5C +:1065500088420FD106203070002060842A20205C01 +:10656000012804D12046FFF757FF0020307028464D +:1065700001B0F0BD052030701020FEF74DFBC04685 +:10658000FFFF0000F0B589B0044623722020205C94 +:106590002646203603280AD02A25675D25462A3557 +:1065A000002F1BD02046FFF76DFF002814D1D748DD +:1065B00006210172042131707A21C9433A31402207 +:1065C000A1540830E0610020A076E0820120208301 +:1065D000217A2046FFF774FE09B0F0BD042809D1E6 +:1065E0002B2000272754A776E7822F70B7803760CB +:1065F000E068E06108910020012B00D11846870077 +:10660000012039460143079191423BD80390012B69 +:1066100006930492059707D1201D04220899FEF7DE +:10662000C6FA059F049A069BE08A00280CD0012B2D +:1066300024D120461230211D0422FEF7D7FA059FEF +:10664000049A069B002819D003213846084390423B +:1066500018D800910899C8190290C8570F467A2196 +:10666000C9437A3149B28525884225DDA7480421EE +:10667000017231703A3540216554A2E70220384357 +:10668000904202D9A148852193E72120205C9842BD +:1066900046D13078012851D1012B7FD1211D042210 +:1066A00008980392FEF7A2FA059F002876D0974833 +:1066B0000621017203997EE70195012B14D13078F0 +:1066C00001281ED1251D2146123104222846FEF73D +:1066D0008DFA069B002807D0029800780199491C82 +:1066E000C9B2884200D0E8E03078012809D1012BF6 +:1066F00000D080E0029800780199491CC9B2884214 +:1067000079D1079978184078795C0F020743208A7D +:10671000C01E87421FDD7D480099017204216DE093 +:106720007A20C04301460831784A11720421317041 +:106730003A30402160540832E26144E7012B56D1DF +:106740002B2000212154A176E1822970B180316093 +:10675000E068E06140E702980078812805D086284B +:10676000019D51D0832800D097E0012B57D1251DE2 +:1067700067497944042228460892FEF737FA002830 +:1067800007D06449794404222846FEF72FFA0028EE +:1067900045D15E480B21017208992FE0089AD11962 +:1067A000D05DA27E904222D10498079A851AE08A91 +:1067B000228B121A954200DB1546AFB2E26910181F +:1067C000491C3A46FEF7F3F90699012908D1E08AF7 +:1067D000E1690918E08C3A46FFF726FB0699E08448 +:1067E000E08A2818E082A07E401CA0763CE0474862 +:1067F00004210172DFE64548042101723170019ADB +:106800003A3240216254DCE6012B6AD1201D424914 +:10681000794404252A46FEF7E9F9002870D0049847 +:106820000599451AFF1CBD4200DB3D46AAB2E0694E +:1068300002990892FEF7BBF9069B012B06D1E1698C +:106840000020089AFFF7F0FA069BE08421202354E9 +:106850002783E5820020A07620461230211D0422E5 +:106860001D46FEF7A4F92946E08A012901D1218BB2 +:1068700006E0218BCA1C824202D22448032198E6FA +:10688000884204D20020606301203070A4E6022018 +:1068900030702046FFF7D2FC9EE61C48039B037233 +:1068A00004213170019A3A32402162540830E0618B +:1068B0000020A076E08223838AE6144C042220463E +:1068C0002946FEF774F90020607101983A30207172 +:1068D000039AA2710620E07108212046FFF7CCFC44 +:1068E0007AE60A48039A0272042131703A3540214F +:1068F00065540830E0610020A076E082228367E6DC +:1069000002480B210172357079E7C046A0210020B2 +:10691000B62F0000A82F00001C2F000080B50649EC +:1069200079440422FEF762F9014601200022002981 +:1069300000D0104680BDC046082E000080B52A2237 +:10694000835C02462A32002906D0002B08D101219F +:106950001170FFF761FD80BD012B01D10220107085 +:1069600080BD000070B504462A20205C002809D0B4 +:10697000012824D02520205C062820D12B20205C53 +:1069800000281CD12020032525544020215400201C +:10699000A076E261E08223832120215C2546213517 +:1069A00003290DD1084E3078002808D0032100E0DB +:1069B00029782046FFF784FC30780028F8D170BD94 +:1069C0002046FFF77DFC70BD3C21002002490020DD +:1069D0000860024908607047F8210020F421002077 +:1069E00010B50748002444704F21017001218170C7 +:1069F0000221C1700421FFF799FA204610BDC0465C +:106A0000241E002070B582B06D4600246C704F26A5 +:106A10002E700220A8700320E8702C7105212846F2 +:106A2000FFF784FA6C702E700120A870E8700421C2 +:106A30002846FFF77BFA204602B070BD10B582B041 +:106A400001A8002444704F210170012181700221AE +:106A5000C1700421FFF76AFA204602B010BD0000A1 +:106A6000B0B582B0144800240460144804606D4638 +:106A70004F2028706C700520A8700420E870012059 +:106A800028716971AC71012A05DC002A0AD0012A3B +:106A90000AD1042006E0022A03D0032A04D10220EE +:106AA00000E00320694688716846C3710821FFF73A +:106AB0003DFA002002B0B0BDF8210020F4210020F2 +:106AC00010B582B06846002444704F22027005223F +:106AD00082700422C2700122027141718471C471FA +:106AE0000821FFF723FA204602B010BDB0B582B0EE +:106AF0000D466846002444705021017003218170C6 +:106B0000C5704021017144710621FFF70FFA802002 +:106B1000054201D0074800E0054801687F22154082 +:106B20000122AA400A430260204602B0B0BDC0461E +:106B3000F8210020F421002070B582B00D4668468F +:106B4000002444705021017003218170C57080269B +:106B5000067144710621FFF7E9F9354201D0074873 +:106B600000E0054801687F2215400122AA409143B8 +:106B70000160204602B070BDF8210020F421002001 +:106B80008020014201D0064800E0044802787F20BE +:106B900001400120884010407047C046F821002085 +:106BA000F421002010B582B06846002444704F22C2 +:106BB0000270022282700322C27001710521FFF768 +:106BC000B5F9204602B010BDB0B582B01C461546DE +:106BD000684650220270C170202101714471E11C8D +:106BE0008170090A41700621FFF7A0F92846214665 +:106BF000FFF79CF9002002B0B0BD10B582B0684626 +:106C0000002444705023037003238370C17030212B +:106C1000017142710621FFF789F9204602B010BDCB +:106C200070B515460E4604460220002C0FD0D42124 +:106C3000204601F087FE002E01D0B02026509C2077 +:106C40000121215425702046FFF7C0FE0020C0B26C +:106C500070BDB0B504469C2001212154B425605973 +:106C6000002806D04068FEF7DBFE02462179204668 +:106C700090470835CC2DF2D12046FFF7DFFE2046A5 +:106C8000FFF7AEFE0020B0BD0223002A07D000238C +:106C9000022804D8C0000818B42142500023D8B2FA +:106CA000704780B5FFF7AEFE002080BDF0B581B023 +:106CB0000C4605460026B4272846314600F066F902 +:106CC000002807D0E8590068FEF7AAFE02462846C9 +:106CD000214690470837761C032EEDD1002001B0E5 +:106CE000F0BDF0B581B00C4605460026B427284615 +:106CF000314600F04BF9002807D0E8594068FEF70C +:106D00008FFE02462846214690470837761C032E00 +:106D1000EDD1002001B0F0BDB0B504462546A83540 +:106D2000284600F077FB942001212150AE20205A04 +:106D300098216050A820215C1F200840022808D01C +:106D400001280BD000280ED12046294600F02BF94F +:106D50000EE02046294600F0D8FA09E020462946F0 +:106D600000F0AFFA04E0802001402046FFF7BEFEAD +:106D70000020B0BDF0B583B0029204460191002915 +:106D80001CD025469C350027B4262046394600F005 +:106D9000FDF800280DD0A0598069002809D0297875 +:106DA000032906D1FEF73CFE034620460199029ACC +:106DB000984708367F1C032FE7D12FE094202058F6 +:106DC00003282BD1E16D206E81420AD9091AE165B1 +:106DD000814200D301468AB22046029900F0C7FDE5 +:106DE0001CE026469C360025B4272046294600F0A4 +:106DF000CDF800280BD0E0590069002807D0317881 +:106E0000032904D1FEF70CFE0146204688470837C7 +:106E10006D1C032DE9D1204600F0B0FD002003B029 +:106E2000F0BDF0B581B00446009100291BD0274683 +:106E30009C370026B4252046314600F0A7F80028EC +:106E40000CD060594069002808D03978032905D151 +:106E5000FEF7E6FD02462046009990470835761C6D +:106E6000032EE8D14DE094202058022842D1E06959 +:106E7000266AB0420AD9D022A1588919A150801B94 +:106E8000E06182B2204600F064FD33E0A569284647 +:106E9000314601F067FCB5420FD300290DD198208F +:106EA000205826469836854207D200252046294696 +:106EB0002A4600F04EFD35601CE026469C36002533 +:106EC000B4272046294600F061F800280BD0E0598D +:106ED000C068002807D03178032904D1FEF7A0FD4F +:106EE00001462046884708376D1C032DE9D120460E +:106EF00000F050FDA020205CA034012801D100202A +:106F00002070002001B0F0BD70B504469C20012126 +:106F100021544020206220660025B42620462946C0 +:106F200000F034F8002807D0A0594068FEF778FD3B +:106F3000024621792046904708366D1C032DEDD17D +:106F4000002070BD017400207047002070470020B1 +:106F5000704770B504469C20205C032814D100259E +:106F6000B4262046294600F011F8002808D0A05980 +:106F7000C069002804D0FEF753FD0146204688472B +:106F800008366D1C032DECD1002070BD0246002098 +:106F9000022907D8C8001018B4214158012000293F +:106FA00000D10846704780B54A78042A08DD072AD0 +:106FB0000FDC052A14D0062A1BD100F021F81DE0B1 +:106FC000002A10D0012A17D0032A12D100F034F978 +:106FD00014E0082A0AD0092A0BD100F0BDF80DE010 +:106FE00000F094F80AE000F005F907E000F0EBF893 +:106FF00004E000F0E3FB01E000F03BF9002080BD7D +:10700000B0B582B00D46044601A8002101806A880F +:10701000100A052812DC01281CD0022824D00328DD +:1070200037D1D0B2022839DC00285FD0012865D0E2 +:1070300002282ED1B0202058C0680EE006281CD0AF +:10704000072823D00F2824D1B0202058C069002859 +:1070500003D11EE0B02020580068FEF7E1FC024694 +:10706000207C01A990472FE0B420205800282CD084 +:10707000217C002922D0C06A21E0207C002808D190 +:10708000B4202058002804D0406B18E0207C002851 +:107090000ED02046294600F091FB25E0032829D098 +:1070A00004282FD00528F4D1B02020588069D4E7D7 +:1070B000B42020580028ECD0006B00E0806AFEF776 +:1070C000AFFC014601A88847014601A80288002AB2 +:1070D0000AD0E888002807D0824200D3024601A8DF +:1070E0000280204600F020FC02B0B0BDB020205845 +:1070F0004068B2E7B02020580069AEE7B0202058C1 +:107100008068AAE7B02020584069A6E770B5044619 +:10711000888800280BD1C888002808D148887F2695 +:1071200006409C20205C25469C35032803D1204640 +:1071300000F044FB70BD9E202654F1B22046FFF7BC +:1071400031FD204600F01AFC002E02D002202870EB +:1071500070BD0120287070BD70B50D460446AE7834 +:10716000022E1DD29C20215C20469C30032907D092 +:10717000022915D1002E22D066600321017009E09A +:10718000002E12D06068B04219D0C1B22046FFF77D +:10719000A8FD666020463146FFF788FD02280ED123 +:1071A0002046294600F00AFB70BD0221017066608E +:1071B00020463146FFF795FD204600F0DFFB2046D4 +:1071C00000F0DCFB70BD80B5CA88012A0AD19C2280 +:1071D000825C032A09D0022A04D100218160014681 +:1071E000083103E000F0EAFA80BD011D012200F041 +:1071F0009BFB80BDB0B504469C20205CFE22024073 +:10720000022A15D10120E060A420215825460C3522 +:107210000320002905D0204600F0BCFBE1680220D5 +:107220000843E06002222046294600F07DFBB0BD05 +:10723000204600F0C3FAB0BDB0B50D4604466888DC +:10724000012815D1A42001212150287902280CD829 +:10725000C0002018B4214058002806D08068FEF7EE +:10726000DFFB0246204629469047204600F086FB79 +:10727000B0BDB0B50D4604469C20205CFE21014007 +:10728000022919D1688801281AD1A420002121508F +:10729000287902280CD8C0002018B42140580028B2 +:1072A00006D08068FEF7BCFB024620462946904780 +:1072B000204600F063FBB0BD2046294600F07EFA70 +:1072C000B0BDB0B50D4604469C20205C032816D105 +:1072D0002879022813D8C0002018B421405800286B +:1072E0000DD08068FEF79CFB024620462946904759 +:1072F000E888002807D1204600F040FB03E0204644 +:10730000294600F05BFA0020B0BDB0B50D4604463A +:107310002878602202402979202A0FD102290DD82D +:10732000C8002018B4228058002807D08068FEF7D3 +:1073300077FB024620462946904769E06878002896 +:1073400016D001281DD0032862D19C20205C032880 +:107350001BD16888002807D180200843802803D0EB +:107360002046FFF7C3FB297902294ED8C80040E028 +:107370009C20205C032817D0022810D148060AD18F +:1073800046E09C20205C032827D0022807D18020DB +:10739000084380283CD02046FFF7A8FB38E0204671 +:1073A000294600F00BFA33E07F2008400001201846 +:1073B0000546543514308022114200D0054620463F +:1073C000FFF7DEFB0121002800D1014629600222DF +:1073D0002046294600F0A8FA1AE06888002817D14C +:1073E000480612D02046FFF7A7FB287902280CD8C0 +:1073F000C0002018B4214058002806D08068FEF74D +:107400000FFB0246204629469047204600F0B6FA78 +:107410000020B0BD0A7802704A7842708A78CB7832 +:107420001B02134343800A794B791B021343838069 +:107430008A79C97909021143C180704710B50446A1 +:107440008021FFF753FB00212046FFF74FFB10BDC3 +:1074500070B582B00D46044601A900200880694637 +:1074600008702A7860211140002910D0202938D1D5 +:1074700069780A460A3A022A33D302291BD0032923 +:1074800019D02046294600F099F9022029E06978B0 +:107490000B2913D00A290ED0062922D16888000AA8 +:1074A000002221280ED02228114616D101AE3046E6 +:1074B00000F058F80AE0694601220EE0204600F08C +:1074C0005DFA0DE001AE304600F032F80146328838 +:1074D000E888824200D302463280204600F024FA37 +:1074E0000020C0B202B070BDF0B581B00446822168 +:1074F0000326402532462B46FFF7B2FA02272046E4 +:10750000394632462B46FFF7ABFA204639462A4623 +:10751000FFF773FB002001B0F0BD10B504468221D7 +:10752000FFF7CEFA02212046FFF7CAFA002010BD6D +:10753000AC21094A515C0922012905D0002906D154 +:1075400007497944092204E00449794401E0002212 +:107550001146028008467047FC210020E621000009 +:10756000FA210000F0B581B00446AC201349085C54 +:107570002221002819D001281AD11048812103277F +:1075800040263A463346FFF76BFA01250B48294659 +:107590003A463346FFF764FA084829463246FFF771 +:1075A0002CFB08487844222104E00548784401E097 +:1075B00000210846218001B0F0BDC046FC2100201A +:1075C000BB210000A1210000F0B581B0044681215B +:1075D0000326402532462B46FFF742FA0127204674 +:1075E000394632462B46FFF73BFA204639462A46B3 +:1075F000FFF703FB002001B0F0BD000080B50129BA +:1076000003D103480121FEF75BFE002080BDC04688 +:107610005C210020B0B5144601290DD1012540227E +:107620002946FFF7EAFA2846FDF750FB02460348D1 +:1076300021462B46FEF7A6FF0020B0BD5C210020AE +:1076400080B5022903D103487844FDF79FFF00204D +:1076500080BDC04651D7FFFFB0B51446022919D1ED +:1076600002214022FFF7C9FA0B4DA879002811D159 +:107670000220FDF72BFB0246094878442146FDF71E +:10768000CBFE022806D1072028700120A8710348EC +:10769000006868800020B0BD3C210020E42100206B +:1076A0001FD7FFFF70B504468321032540262A46D5 +:1076B0003346FFF7D5F9204629462A463346FFF7D9 +:1076C000CFF9204629463246FFF797FA002070BDD1 +:1076D000002070470020704780B5032903D103487C +:1076E0007844FDF753FF002080BDC046C9D6FFFF98 +:1076F000B0B51446032919D103214022FFF77DFAC2 +:107700000B4DA879002811D10320FDF7DFFA0246BE +:10771000094878442146FDF77FFE022806D10B2058 +:1077200028700520A8710348006868800020B0BD5B +:107730003C210020E421002097D6FFFF1220088082 +:10774000014878447047C046CA22000004200880DF +:10775000014878447047C046CC2200000E200880C3 +:10776000014878447047C046C02200000E200880BF +:10777000014878447047C046BE2200000A200880B5 +:10778000014878447047C046BC2200000E200880A3 +:10779000014878447047C0469E2200000E200880B1 +:1077A000014878447047C0468E2200003920088086 +:1077B000014878447047C046D71F000080B50A785A +:1077C00052B2002A02DBFFF739FE80BD4A78772AE1 +:1077D0000FD0062AF7D14A88194B9A42F3D1CA88AA +:1077E0001221122A00D30A461649794400F09CF867 +:1077F00080BD8A88042A09D1CA882821282A00D372 +:107800000A461149794400F08FF880BD8A88052A1C +:1078100009D1CA889221922A00D30A460B49794499 +:1078200000F082F880BD8A88072ACCD1CA88B221AC +:10783000B22A00D30A460649794400F075F880BDA3 +:10784000EE030000FA1F0000F21F000000200000FD +:107850007820000070B5044623480025D42229462C +:10786000FDF7BBF9214E30460C3004222946FDF7C6 +:10787000B4F91036082230462946FDF7AEF9002C3F +:107880002DD0194C0025D42220462946FDF7A5F914 +:107890001949794420462A46FFF7C2F9174A7A4423 +:1078A00028462146FFF7F0F90120154A7A4421467F +:1078B000FFF7EAF9FF2252320D480E49FEF7F6FCB7 +:1078C0000220104A7A442146FFF7DEF903214022C4 +:1078D0002046FFF792F92046FFF7E3F970BD024812 +:1078E000FFF7B7F970BDC046FC2100203C21002005 +:1078F0005C210020E81F0020321F0000C62000008D +:10790000F02000001021000060210180014878442F +:107910007047C0463A2100000A210180014878449E +:107920007047C0468A210000B0B50C46942102235E +:107930004350D02144508261C261016A914200D813 +:107940000A4693B2002529462246FFF73DF928460C +:10795000B0BDB0B50C46016A914200D80A4693B258 +:10796000002529462246FFF72FF92846B0BD10B55D +:1079700000242146FFF741F9204610BD10B594219F +:10798000042242500024214622462346FFF71CF9D8 +:10799000204610BD10B594210522425000242146F6 +:1079A0002246FFF72AF9204610BD0000B0B5124963 +:1079B0000A780120012A1DD8521E0C235343CB18EC +:1079C0001A8B002A16D01969002913D09B8A002B24 +:1079D00006D194000C190325ED436459E41C09D128 +:1079E000934206D29A0089180322D2438958891CEF +:1079F00000D00020B0BDC046241D002010B50E49A7 +:107A00000A780120012A16D8521E0C235343CB18A2 +:107A10001A8B002A0FD0196900290CD09B8A541E9A +:107A20009C4208DD921E9A4204DD9A00891849683A +:107A3000891C00D0002010BD241D002008480178BA +:107A400000290AD00C224A4380184189028901206A +:107A50008A4203D8FF208A4200D3002040B27047F8 +:107A6000241D0020F0B581B00146164A1078012887 +:107A700026D8401E0C234343D218168B002E1FD04D +:107A80001569002D1CD0022E1AD3948A1346143384 +:107A9000771EA74214DDB61EA6420ADBA600AD196A +:107AA0006D68AE1C0CD0ED1C03D100211980D18271 +:107AB00004E0D482621C1A80002901D000F03EF854 +:107AC00001B0F0BD241D002080B50120FFF7CAFFE2 +:107AD00080BD0000B0B517490878012829D8401E9C +:107AE0000C22424389180A8B002A22D00C69002CF0 +:107AF0001FD0022A1DD38D8A0B461433002D0AD0C5 +:107B0000AA00A2180324E4431259921C11D0CD827A +:107B1000691E19800BE0950064190325ED43645933 +:107B2000E41C06D1044C14191C80521ECA8200F0B9 +:107B300005F8B0BD241D0020FEFF0000F0B581B0A7 +:107B400004460C2060431A490E183069B18A890036 +:107B500040583746143710360321C943884224D889 +:107B6000FDF75EFF31683A8892008958056808463B +:107B7000FDF756FF002D06D00068FDF751FF0146C6 +:107B80002046884711E08068FDF74AFF05463068C7 +:107B9000398889004058FDF743FF4068FDF740FFF2 +:107BA00002462046294600F061F801B0F0BDC0460B +:107BB000241D0020F0B581B02B4D2878012825D850 +:107BC000401E0C2670432A18108B00281ED0116905 +:107BD00000291BD0928A824218D290000858FDF7E3 +:107BE0001FFF806829784C1E6643002810D0A81912 +:107BF0000169808A80000858FDF712FF8068FDF750 +:107C00000FFF01460022204600F030F801B0F0BD21 +:107C1000A819038B002BF9D0828A014614319B1ED0 +:107C20009342F3DB05699600AE1900967768FE1C57 +:107C300013D0BE1CEAD1009E7668B61C09D1521C36 +:107C400096B2B34204DBB600AE197668B61CF6D025 +:107C50000A80C282501C088002E000220A80C28290 +:107C60002046FFF76BFFD1E7241D0020F0B583B05D +:107C700001920C460C221146029041431F4B5F18A3 +:107C80000021398339617961181DFCF7A6FF204670 +:107C90003C4610343D4618353E461636143700280B +:107CA0002AD0FDF7BDFE206029888A008258521C28 +:107CB00006D0491C8AB292008258521CF9D1298000 +:107CC0000198002815D0FDF7ABFE054620683988DD +:107CD000890040580BE0FDF7A3FEA84209D0388880 +:107CE0003080401C388080B2800021680858411CD8 +:107CF000F1D10298FFF722FF03B0F0BD241D002050 +:107D000080B50A49884208D00949884208D0094903 +:107D1000884208D1FFF7DEFE05E0FFF74BFF02E0E7 +:107D20000120FFF79FFE002080BDC04603000080B9 +:107D3000020000800100008010B5014600200029EB +:107D40000FD1084C218BA28A8A420AD22069FDF702 +:107D500067FEA18A89004058FDF762FE4068FDF782 +:107D60005FFE10BD241D002080B503480078401E32 +:107D7000FFF7E2FF80BDC046241D002010B5044679 +:107D800000F00CFC2420604308490818C421052297 +:107D90004254C021064A7A444250BD210122425435 +:107DA000D021044A7A44425010BDC046241D002010 +:107DB0001E1D000059FFFFFF80B500F0FFFA9D2255 +:107DC000002806D003498A5C112A02D1B422024B52 +:107DD0008B5280BD241D00200A80000010B504468F +:107DE000FFF7CCFF2420604304490818CC21044A43 +:107DF0007A444250204600F0A7FB10BD241D00200D +:107E0000C5FFFFFF80B500F0D9FA9D22002806D0FB +:107E100003498A5C102A02D3B422024B8B5280BDE4 +:107E2000241D00200A80000010B50446FFF7A6FFBD +:107E30002420604304490818CC21044A7A44425063 +:107E4000204600F081FB10BD241D0020C5FFFFFF70 +:107E500070B50546FFF788FF0446114E30469C304A +:107E600020222946FCF7A3FE68780146103905292F +:107E70000AD29D20305C0F21014088002058B82193 +:107E800070509C36304670BD022803D00128F8D1CE +:107E9000616800E0E16800200029F2D1F3E7C04604 +:107EA000241D002010B5044600F078FB2420604318 +:107EB0000B490818C42106224254C021094A7A44B9 +:107EC0004250BD2101224254CC21074A7A444250FB +:107ED000D021064A7A444250204600F035FB10BDBE +:107EE000241D0020961C000081FFFFFF29FEFFFFDC +:107EF000F0B587B00E46FFF71FFF06904B4C2046AB +:107F00000C300025022729463A46FCF766FE20463B +:107F10000E30059529463A46FCF75FFE701C04902A +:107F200002D0A06800287DD006984068FDF778FD53 +:107F3000054600F065FE291801220592012871DB33 +:107F400060680590A068029000200390069001955B +:107F50002B468B42039C1A4620D200201A46044628 +:107F600026469D19C01D741C722813D82F781F2F08 +:107F700004DD202F09D02D2F07D003E0092F04D0D6 +:107F80000A2F09D05F2F00D015462A461D198D42B1 +:107F9000E6D303E0344601E09A19741C18198842AC +:107FA00024D2002C069D22D09A4220D00025ED43F9 +:107FB000455D2C2D06DC2E46093E022E16D3202DC3 +:107FC00014D003E02D2D11D05F2D0FD000782C2878 +:107FD00005DC0546093D022D08D3202802E02D28A6 +:107FE00004D05F28069D02D0D41A00E0069D0498B4 +:107FF000002806D00598A84203D10598029A90421D +:108000000AD31B19681C8B4200D328468B4206906A +:108010009FD3401C059005E004480146CC8101989F +:10802000181A8881059807B0F0BDC046241D0020AD +:10803000B0B50446FFF7A2FE094D69682046FFF778 +:1080400057FF242060432818CC21064A7A44425026 +:10805000D021054A7A444250204600F075FAB0BD5E +:10806000241D00201D00000015010000F0B583B0A4 +:108070000546FFF779FE0446374E30469C302022F5 +:108080002946FCF794FD6878102816DC012833D0C7 +:1080900002283BD010285AD12068002841D0B4686B +:1080A000FDF7BEFC03467068B1686A46401C03C217 +:1080B000012C41D82A4A7A4440E00146113903296B +:1080C00045D20F210840401E40003718FD89002D81 +:1080D0003DD06068FDF7A4FCB98940186946086086 +:1080E00034461C348021204A7A4420462B46FDF732 +:1080F000C3FAB82034502AE0FFF758FC01460020AC +:10810000002924D07168002923D020E0FFF776FCF5 +:1081100000281CD07168B068421E0020914216D120 +:1081200017E07168B0686A46106030461C304B1C1E +:1081300080210C4A7A4404E0084A7A4430461C30D4 +:108140008021FDF799FA30461C30B82170509C36DA +:10815000304603B0F0BDC046241D0020DA1A0000EE +:10816000FA110000EB1A00003D1B000080B5174912 +:1081700088420BD01649884213D01649884222D132 +:108180001548416800291CD0491E14E0124988682E +:10819000002803D04968401E884214D1FFF70AFD29 +:1081A00011E00D4841688268521E914202D1FFF7EA +:1081B0008BFC08E0491C41600078401EFFF738FF47 +:1081C00001E0FFF787FC002080BDC046030000806F +:1081D0000200008001000080241D002070B50446CC +:1081E000FFF72CFC01280BD0401C0FD11C4E301D7A +:1081F00000250C222946FCF7F0FCE843706005E0FE +:108200001748001D00210C22FCF7E7FC204600F077 +:10821000C5F92046FFF790FD4068002819D00020DE +:10822000C1432046FFF764FE0D4DA860002807D12A +:10823000281D00210C22FCF7D0FCA868002804D0DF +:10824000401E6968814200D968602046FFF7F0FE51 +:1082500070BD0348001D00210C22FCF7BEFC70BD60 +:10826000241D002070B50546FFF77EFD0446124E22 +:1082700030469C3020222946FCF799FC68780F286C +:1082800006DC01280AD0022812D1FFF7B7FB07E06D +:1082900010280AD011280BD1606807E0FFF786FB91 +:1082A00001460020002903D070BD2068B82170501D +:1082B0009C36304670BDC046241D002010B50446D3 +:1082C00000F06CF9242060430B490818C4210522F2 +:1082D0004254C021094A7A444250BD2101224254ED +:1082E000CC21074A7A444250D021064A7A4442506F +:1082F000204600F029F910BD241D00205619000069 +:108300007DFFFFFF11FAFFFF70B50546FFF72CFD5B +:108310000446164E30469C3020222946FCF747FC86 +:1083200068780F2807DC012812D0022813D00F2804 +:1083300018D1206809E01038022813D29D20305C43 +:108340000F210140880020184068B821705009E0D2 +:10835000FFF72CFB01E0FFF751FB0146002000294D +:1083600000D070BD9C36304670BDC046241D002034 +:1083700010B5044600F012F9242060430B49081898 +:10838000C42106224254C021094A7A444250BD21E8 +:1083900001224254D021074A7A444250CC21064A55 +:1083A0007A444250204600F0CFF810BD241D002032 +:1083B0004219000065F9FFFF65FFFFFF70B5054634 +:1083C000FFF7D2FC0446124E30469C30202229464C +:1083D000FCF7EDFB6878022804D0012809D1FFF7EB +:1083E000E5FA01E0FFF70AFB0146002000290BD067 +:1083F00070BD9D20305CF021084205D00F2108405F +:1084000080002058B82170509C36304670BDC04660 +:10841000241D0020B0B51749884211D01649884262 +:1084200015D01649884222D1F820154C2158E02554 +:108430006059401E8847002819D06059401E11E03D +:10844000E0200F490858FC22895888470FE0F8209F +:108450000B4C2158E0256059401C8847002806D065 +:108460006059401C60512078401E00F00BF800203D +:10847000B0BDC04603000080020000800100008003 +:10848000241D0020F0B581B004460120C6430C4DE8 +:108490002F46E437F8202958E0202858301888471C +:1084A00001C7761C032EF5D12046FFF7FBFC2420E4 +:1084B00060432818D021034A7A44425001B0F0BDED +:1084C000241D002059FFFFFFB0B50446F8200B4DD6 +:1084D0002950E0202B50FC202A502046FFF72CFC8E +:1084E000E435A84206D00649794400222046FFF729 +:1084F000BDFBB0BD2046FFF7C5FFB0BD241D002069 +:10850000B418000080B50023FFF7DEFF80BD000037 +:10851000B0B50C4D2878002811D12846BC30002475 +:1085200024222146FCF759FB28780C2250432818B6 +:1085300010302146FCF751FB2878401C2870C0B24F +:10854000401EB0BD241D0020B0B50446124802787C +:10855000002A0ED0611C91420BD1242161434518A1 +:10856000FCF7AEFCBE2000212952204600F02AF87C +:10857000B0BD01210023002A0A4600D01A46641C1F +:1085800000D019461143012904D14178AA2901D10B +:1085900069214170B0BDC046241D002070B524245F +:1085A000604307490E18FCF78BFC3046BC300025B1 +:1085B00029462246FCF711FBBC20355470BDC0464D +:1085C000241D0020F0B581B004460420FDF7EEFC28 +:1085D00000283CD097283AD0242060431D490C182D +:1085E000C02020582546C0352646BE3600282ED04D +:1085F0002046CC300090C4343088AA27217880B23D +:10860000884224D2FDF79EFC002820D1FDF71CFCF7 +:10861000B84203D1FDF742FCB84218D1286831882E +:108620004901401800990968002902D088470028AC +:1086300007D0012803D12868318849014018FBF789 +:10864000A2FB3088401C308029680029D6D101B0B7 +:10865000F0BDC046241D0020002243088B4274D385 +:1086600003098B425FD3030A8B4244D3030B8B4233 +:1086700028D3030C8B420DD3FF22090212BA030C3C +:108680008B4202D31212090265D0030B8B4219D31D +:1086900000E0090AC30B8B4201D3CB03C01A52413D +:1086A000830B8B4201D38B03C01A5241430B8B4285 +:1086B00001D34B03C01A5241030B8B4201D30B036E +:1086C000C01A5241C30A8B4201D3CB02C01A524195 +:1086D000830A8B4201D38B02C01A5241430A8B4258 +:1086E00001D34B02C01A5241030A8B4201D30B0241 +:1086F000C01A5241CDD2C3098B4201D3CB01C01A5B +:10870000524183098B4201D38B01C01A5241430964 +:108710008B4201D34B01C01A524103098B4201D352 +:108720000B01C01A5241C3088B4201D3CB00C01ABF +:10873000524183088B4201D38B00C01A5241430837 +:108740008B4201D34B00C01A5241411A00D201465C +:10875000524110467047FFE701B5002000F0F0F8E5 +:1087600002BDC0460029F7D076E7704703460B43A9 +:108770007FD4002243088B4274D303098B425FD31A +:10878000030A8B4244D3030B8B4228D3030C8B4246 +:108790000DD3FF22090212BA030C8B4202D312122C +:1087A000090265D0030B8B4219D300E0090AC30B01 +:1087B0008B4201D3CB03C01A5241830B8B4201D3AE +:1087C0008B03C01A5241430B8B4201D34B03C01A97 +:1087D0005241030B8B4201D30B03C01A5241C30A0F +:1087E0008B4201D3CB02C01A5241830A8B4201D380 +:1087F0008B02C01A5241430A8B4201D34B02C01A6A +:108800005241030A8B4201D30B02C01A5241CDD20E +:10881000C3098B4201D3CB01C01A524183098B4259 +:1088200001D38B01C01A524143098B4201D34B0142 +:10883000C01A524103098B4201D30B01C01A5241A5 +:10884000C3088B4201D3CB00C01A524183088B422C +:1088500001D38B00C01A524143088B4201D34B0015 +:10886000C01A5241411A00D2014652411046704787 +:108870005DE0CA0F00D04942031000D3404253408C +:1088800000229C4603098B422DD3030A8B4212D34C +:10889000FC22890112BA030A8B420CD3890192117E +:1088A0008B4208D3890192118B4204D389013AD0BB +:1088B000921100E08909C3098B4201D3CB01C01A90 +:1088C000524183098B4201D38B01C01A52414309A3 +:1088D0008B4201D34B01C01A524103098B4201D391 +:1088E0000B01C01A5241C3088B4201D3CB00C01AFE +:1088F000524183088B4201D38B00C01A5241D9D216 +:1089000043088B4201D34B00C01A5241411A00D296 +:108910000146634652415B10104601D34042002B92 +:1089200000D54942704763465B1000D3404201B511 +:10893000002000F005F802BD0029F8D016E77047C6 +:108940007047C04610B5002200F00AF810BDC046BE +:1089500010B500F031F810BD10B500F07FF810BD73 +:108960000B0010B511001A0000F0D4F810BDC0467D +:1089700030B5032A0CD903000B439B0719D10368B8 +:108980000C68A34215D1043A04300431032AF6D806 +:10899000551E002A0BD0002303E05A1C9D4206D02E +:1089A0001300C25CCC5CA242F7D0101B00E0002098 +:1089B00030BD551EEFE7C046F0B5C64600B50F2ADC +:1089C00041D903270D003E0005430C0003002E4053 +:1089D0002F423DD11500103D2D09AC462D01A84672 +:1089E0008044256867681D605F60A568E7689D60D2 +:1089F000DF6010341F0010334745F2D165460F2366 +:108A00000C2401352D01491913404519144222D077 +:108A10008C59AC5104369C1B032CF9D80324043B1D +:108A20009B0801339B002240ED18C918561E002AEE +:108A300006D00023CC5C1A00EC5401339642F9D1E5 +:108A400080BCB846F0BD0500561E002AF1D1F7E7FC +:108A50000500561EEDE71A00F6E7C046F0B5C6461B +:108A600000B588420CD98B18984209D2531E002AAF +:108A700003D0CA5CC254013BFBD280BCB846F0BDF7 +:108A80000F2A0BD80500561E002AF6D00023CC5C16 +:108A90001A00EC5401339642F9D1EEE703270D009A +:108AA0003E0005430C0003002E402F422CD1150040 +:108AB000103D2D09AC462D01A846804425681F00B5 +:108AC0001D6065685D60A5689D60E5681034DD60C7 +:108AD00010334745F2D165460F230C2401352D0193 +:108AE000491913404519144211D08C59AC51043620 +:108AF0009C1B032CF9D80324043B9B0801339B00E7 +:108B0000ED18C9182240BEE70500561EBEE71A0040 +:108B1000B9E7C046F0B5050083074AD0541E002AC5 +:108B200044D003000322CEB202E00135013C3DD324 +:108B300001332E701342F8D1032C2FD9FF220A40A3 +:108B4000150215432A0415430F2C35D92700103F71 +:108B50003F093E01B4461E001A00103666441560F7 +:108B600055609560D5601032B242F8D10F260C22C4 +:108B700001373F012640DB193700224217D03E1F44 +:108B8000B608B400A4461A001C1D644420C2A242C8 +:108B9000FCD103240136B6009B193C40002C05D0C3 +:108BA000C9B21C19197001339C42FBD1F0BD3400CD +:108BB000F4E714000300BFE72700E0E7F0C04146F8 +:108BC0004A4653465C466D4676467EC02838F0C815 +:108BD0000020704710307CC890469946A246AB46AC +:108BE000B54608C82838F0C8081C00D1012018472D +:108BF00003000A7801311A700133002AF9D1704755 +:108C000010B583070AD00300032102E001330B42B1 +:108C100005D01A78002AF9D1181A10BD0300196876 +:108C20000C4A0D4C8A188A4322420FD15968094ACE +:108C300004338A188A43224208D15968054A04330A +:108C40008A188A432242F1D000E001331A78002AC0 +:108C5000FBD1E1E7FFFEFEFE8080808030B5002A78 +:108C600028D003000B439B0713D1032A11D9134DBE +:108C70000BE0043A002A1DD0114C1C199C432C42D5 +:108C800018D104300431032A03D903680C68A342C5 +:108C9000EFD004780D78A5420ED1012A0AD0012325 +:108CA00006E0C45CCD5CAC4206D101339A4201D0EF +:108CB000002CF6D1002030BD601BFCE78080808056 +:108CC000FFFEFEFEF0B50C00044303000600A407FF +:108CD00012D1032A10D9144CA44666460D68134CD1 +:108CE0001F002C19AC4334421CD10433043A1E003B +:108CF00004313D60032AF0D80024B71806E00D5D6A +:108D0000013A3555BB1A0134002D02D0002AF6D1A4 +:108D1000F0BD0021D418002AFAD0197001339C420A +:108D2000FBD1F5E71E00E7E780808080FFFEFEFEB6 +:108D300030B5050008002B006C18002903D106E0AF +:108D400001339C4203D01A78002AF9D1581B30BD58 +:108D500025303858001976A91488AC17A914873D16 +:108D6000A91487209EC9845ACB02FAB24E1C03680C +:108D7000B3B517C1A4488FBA97F0E3459AC053EA38 +:108D80000100000003C01F02B41600142200203F9F +:108D900076A91488AC209EC9845ACB02FAB24E1C24 +:108DA0000368B3B517C1A4488FBA97F0E3459AC0DA +:108DB00053EA0100000003C01F02B4232102232153 +:108DC00003434104AC25750031323334353637382E +:108DD0003941424344454647484A4B4C4D4E505119 +:108DE00052535455565758595A61626364656667C1 +:108DF00068696A6B6D6E6F7071727374757677786F +:108E0000797AE0E0E0E0E0E0E0E0E0E0E0E0E020EF +:108E1000222426404244484A4EC0C41601010001A3 +:108E2000010101010101000000000000A117D0C0F4 +:108E3000B11CD0C07103D0C0DD16D0C0CD05D0C0EC +:108E40002504D0C00912D0C00914D0C08910D0C0E8 +:108E5000411CD0C0E903D0C02503D0C05502D0C00A +:108E6000626974636F696E636173680071707A72AE +:108E700079397838676632747664773073336A6E1E +:108E800035346B686365366D7561376C00000000C2 +:108E900000000000FFFFFF00000000000C400BF886 +:108EA00007FCC0F3F03CF003FE012D0003000000BE +:108EB000000000000E0000000E0000000100000095 +:108EC000908ED0C0988ED0C000000000FFFFFF0041 +:108ED000008001E6C071383807FC001E8007F003EF +:108EE000CEC1E13870061800000000000E0000003E +:108EF0000E00000001000000C88ED0C0D08ED0C08F +:108F000000000000FFFFFF00000000000C8007F0E1 +:108F100003FEC1FFF03FF003CC0033C00C000000A3 +:108F2000000000000E0000000E0000000100000024 +:108F3000008FD0C0088FD0C000000000FFFFFF00EE +:108F400041110501070000000400000001000000BD +:108F5000388FD0C0408FD0C000000000FFFFFF005E +:108F6000000000001EE01F1C0E03638C19630C0C34 +:108F700087837F8007000000000000000E000000D3 +:108F80000E00000001000000588FD0C0608FD0C0DC +:108F900000000000FFFFFF0048124208040000002C +:108FA0000700000001000000908FD0C0988FD0C053 +:108FB00000000000FFFFFF002184240104000000E6 +:108FC0000700000001000000B08FD0C0B88FD0C0F3 +:108FD00000000000FFFFFF00088A280807000000CB +:108FE0000400000001000000D08FD0C0D88FD0C096 +:108FF00000000000FFFFFF00000000000000C000B4 +:10900000380067E0381C9C037E000F8001000000E0 +:10901000000000000E0000000E0000000100000033 +:10902000F08FD0C0F88FD0C000000000FFFFFF001D +:10903000000030000C80072001CC0033E01C380712 +:10904000FFC3F3F87CFE1F00000000000E000000CC +:109050000E000000010000002890D0C03090D0C069 +:109060004175746F20417070726F76616C004D6154 +:109070006E75616C20417070726F76616C00426138 +:10908000636B005075626C6963206B657973206552 +:1090900078706F7274004170706C69636174696F8D +:1090A0006E00697320726561647900536574746938 +:1090B0006E67730056657273696F6E00312E352EC0 +:1090C000330051756974005369676E006D65737381 +:1090D000616765004D6573736167652068617368DA +:1090E0000043616E63656C007369676E61747572CD +:1090F0006500526576696577007472616E736163AD +:1091000074696F6E00416D6F756E740041646472B6 +:109110006573730046656573004163636570740031 +:10912000616E642073656E640052656A65637400E5 +:109130004F505F53454E44455200436F6E6669720F +:109140006D005468652064657269766174696F6E3C +:10915000007061746820697320756E757375616C39 +:10916000210044657269766174696F6E2070617464 +:10917000680052656A65637420696620796F752797 +:109180007265006E6F742073757265004170707245 +:109190006F76652064657269766174696F6E0041EF +:1091A0007070726F766500436F6E6669726D2074C1 +:1091B0006F6B656E004578706F7274007075626CCD +:1091C0006963206B65793F00546865206368616E50 +:1091D0006765207061746800697320756E757375BA +:1091E000616C004368616E6765207061746800544B +:1091F0006865207369676E207061746800536967E1 +:109200006E207061746800556E7665726966696576 +:109210006420696E707574730055706461746500C4 +:10922000204C6564676572204C697665006F72201A +:1092300074686972642070617274790077616C6C13 +:10924000657420736F66747761726500436F6E7426 +:10925000696E7565004F505F53454E4445525F43FC +:109260005245415445004F505F43524541544500DB +:109270004C0E968C0044656C656761746520746F54 +:109280002025732028666565202564202525290072 +:109290003D666E8B003031323334353637383941E4 +:1092A00042434445460043616C6C20636F6E7472A8 +:1092B000616374202573006F6D6E69004F4D4E49D8 +:1092C00020005553445420004D41494420004F4D47 +:1092D0004E492061737365742025642000252E2A71 +:1092E000482E2E2E252E2A48006F75747075742016 +:1092F000232564005174756D005154554D007471EF +:10930000000000006090D0C06E90D0C07E90D0C0B1 +:109310008390D0C07E90D0C09690D0C0A290D0C094 +:10932000297ED0C01893D0C00000000000000000CB +:10933000D13CD0C000000000000000000000000090 +:109340003093D0C0FFFFFFFFB48ED0C0AB90D0C031 +:10935000BD82D0C04893D0C04093D0C00000000070 +:10936000B490D0C0BC90D0C0DD7DD0C06093D0C0E0 +:109370000000000000000000ED3CD0C00000000034 +:1093800000000000000000007893D0C0FFFFFFFF46 +:10939000248FD0C0C290D0C0BD82D0C09093D0C026 +:1093A0008893D0C0000000002093D0C05093D0C05C +:1093B0006893D0C09893D0C0FDFFFFFFFFFFFFFF71 +:1093C000F73CD0C0000000000000000000000000DA +:1093D000C093D0C0FFFFFFFF1490D0C0A791D0C0B2 +:1093E000B02000207183D0C0D893D0C0D093D0C01B +:1093F00000000000053DD0C000000000000000009B +:1094000000000000F493D0C0FFFFFFFFEC8ED0C03F +:109410002991D0C0BD82D0C00C94D0C00494D0C0DB +:1094200000000000E493D0C01494D0C0FFFFFFFF01 +:10943000133DD0C00000000000000000000000004C +:109440003094D0C0FFFFFFFF1490D0C0B591D0C0C2 +:10945000BC91D0C07183D0C04894D0C04094D0C0DB +:1094600000000000213DD0C000000000000000000E +:10947000000000006494D0C0FFFFFFFFEC8ED0C05E +:109480002991D0C0BD82D0C07C94D0C07494D0C08B +:10949000000000005494D0C08494D0C0FFFFFFFFB0 +:1094A0007C8FD0C0C891D0C0D891D0C07183D0C0BB +:1094B000A094D0C00000000000000000E391D0C0E4 +:1094C00000180020DD81D0C0BC94D0C00000000096 +:1094D000000000002F3DD0C0000000000000000090 +:1094E00000000000D494D0C0FFFFFFFFEC8ED0C07E +:1094F0007291D0C08391D0C07183D0C0EC94D0C0A1 +:10950000E494D0C0000000003D3DD0C00000000049 +:1095100000000000000000000895D0C0FFFFFFFF22 +:109520001490D0C09F91D0C0BD82D0C02095D0C033 +:109530001895D0C000000000AC94D0C0C494D0C036 +:10954000F894D0C02895D0C0FFFFFFFF7C8FD0C01B +:10955000EF91D0C0D891D0C07183D0C04C95D0C00D +:109560000000000000000000FD91D0C000180020A5 +:10957000DD81D0C06895D0C0000000000000000070 +:109580004B3DD0C0000000000000000000000000C3 +:109590008095D0C0FFFFFFFFEC8ED0C07291D0C08D +:1095A0008391D0C07183D0C09895D0C09095D0C021 +:1095B000000000005B3DD0C0000000000000000083 +:1095C00000000000B495D0C0FFFFFFFF1490D0C092 +:1095D0009F91D0C0BD82D0C0CC95D0C0C495D0C022 +:1095E000000000005895D0C07095D0C0A495D0C0A0 +:1095F000D495D0C0FFFFFFFF4C90D0C00792D0C0E1 +:10960000BD82D0C0F895D0C000000000000000006E +:109610001992D0C02092D0C0297ED0C01096D0C060 +:1096200000000000000000002D92D0C03C92D0C08D +:10963000297ED0C02896D0C00000000000000000A5 +:109640006B3DD0C0000000000000000000000000E2 +:109650004096D0C0FFFFFFFFEC8ED0C0E190D0C09D +:10966000BD82D0C05896D0C05096D0C00000000037 +:10967000793DD0C0000000000000000000000000A4 +:109680007096D0C0FFFFFFFF1490D0C04C92D0C0A6 +:10969000BD82D0C08896D0C08096D0C000000000A7 +:1096A0000096D0C01896D0C03096D0C06096D0C07A +:1096B0009096D0C0FFFFFFFF4F505F524554555268 +:1096C0004E000000556E64656C656761746500004E +:1096D00000000000B001000000B0A7000000B002D0 +:1096E0000000003031323334353637383961626347 +:1096F0006465663031323334353637383941424368 +:109700004445466F00900167006985F1D000000074 +:10971000004254430090009000006A805532465F3A +:1097200056329000010990006E006D00FFFFFFFFB0 +:109730000000000009211101210122220000000087 +:1097400009211101000122220006D0F10901A10125 +:109750000903150026FF00750895408108090415C6 +:109760000026FF00750895409108C006A0FF09017A +:10977000A1010903150026FF00750895408108091D +:1097800004150026FF00750895409108C0050F39A3 +:1097900000021810050038B60834A909A0478BFD4F +:1097A000A0768815B66500011E001C100500DF605C +:1097B000DDD88945C74C9CD2659D9E648A9F000078 +:1097C0000306B200770000003D77D0C04D77D0C0CF +:1097D0005D77D0C06D77D0C07D77D0C08D77D0C099 +:1097E0009D77D0C0AD77D0C012034D005300460026 +:1097F00054003100300030007700280000000001E4 +:1098000004000100000000000000020157494E550D +:1098100053420000000000000000000000000000B3 +:109820000000920000000001050001008800000017 +:10983000070000002A00440065007600690063000C +:10984000650049006E0074006500720066006100EA +:1098500063006500470055004900440073000000A4 +:10986000500000007B0031003300640036003300FC +:109870003400300030002D00320043003900370042 +:109880002D0030003000300034002D00300030005A +:10989000300030002D003400630036003500360003 +:1098A00034003600370036003500370032007D00C6 +:1098B000000000000A00000000000306B2000800DB +:1098C00001000000A800080002000200A00014002F +:1098D000030057494E5553420000000000000000AD +:1098E00000008400040007002A00440065007600A0 +:1098F00069006300650049006E0074006500720035 +:10990000660061006300650047005500490044009F +:109910007300000050007B00430045003800300019 +:1099200039003200360034002D003400420032008D +:1099300034002D0034004500380031002D00410076 +:109940003800420032002D00350037004500440049 +:10995000300031004400350038003000450031004F +:109960007D00000000000000E974D0C01B75D0C06D +:109970005174D0C000000000000000004176D0C04B +:109980005976D0C000000000000000000000000078 +:109990000979D0C00979D0C00979D0C01979D0C06F +:1099A000C975D0C01B75D0C05174D0C00000000074 +:1099B00000000000FD75D0C01576D0C0000000008A +:1099C00000000000000000000979D0C00979D0C073 +:1099D0000979D0C01979D0C0A576D0C0D176D0C0D1 +:1099E000D576D0C00000000000000000D976D0C0BD +:1099F000F176D0C000000000000000000000000070 +:109A00000979D0C00979D0C00979D0C01979D0C0FE +:109A10001201100200000040972C01000102010217 +:109A20000301040309040E034C0065006400670091 +:109A3000650072000E034E0061006E006F00200092 +:109A400053000A033000300030003100090260008A +:109A5000030102C0320904000002030000020921D0 +:109A600011010001222200070582034000010705C1 +:109A7000020340000109040100020301010209215F +:109A80001101210122220007058103400001070581 +:109A900001034000010904020002FFFFFF02070565 +:109AA0008303400001070503034000010A0600028A +:109AB00000000040010000000300000000008000E2 +:109AC000200000000100000000000000FFFFFF0078 +:109AD0000000000000000000050102000C0004006E +:109AE0000700000000000000FFFFFF000000000072 +:109AF000000000009C8FD0C005027A000C0004001A +:109B00000700000000000000FFFFFF000000000051 +:109B100000000000BC8FD0C0071000000C008000C7 +:109B20002000000000000000FFFFFF000000000018 +:109B30000880000000000000071100001A008000EB +:109B40002000000000000000FFFFFF0000000000F8 +:109B500008800000000000000300000000008000FA +:109B6000200000000100000000000000FFFFFF00D7 +:109B70000000000000000000050100000E000700CA +:109B80000400000000000000FFFFFF0000000000D4 +:109B900000000000DC8FD0C0050278000E00070036 +:109BA0000400000000000000FFFFFF0000000000B4 +:109BB00000000000448FD0C00711000003008000A7 +:109BC0002000000000000000FFFFFF000000000078 +:109BD0000A8000000000000007120000130080004F +:109BE0002000000000000000FFFFFF000000000058 +:109BF0000880000000000000071300002300800020 +:109C00002000000000000000FFFFFF000000000037 +:109C10000A800000000000002573202825642F25FD +:109C200064290025642F256400252E2A7300000076 +:109C30000300000000008000200000000100000080 +:109C400000000000FFFFFF00000000000000000017 +:109C5000050102000C0004000700000000000000E5 +:109C6000FFFFFF0000000000000000009C8FD0C03C +:109C700005027A000C00040007000000000000004C +:109C8000FFFFFF000000000000000000BC8FD0C0FC +:109C90000510380002001000100000000000000055 +:109CA000FFFFFF00000000000A800000000000002D +:109CB000071100001C0080002000000000000000D0 +:109CC000FFFFFF000000000008800000000000000F +:109CD00003000000000080002000000001000000E0 +:109CE00000000000FFFFFF00000000000000000077 +:109CF000050102000C000400070000000000000045 +:109D0000FFFFFF0000000000000000009C8FD0C09B +:109D100005027A000C0004000700000000000000AB +:109D2000FFFFFF000000000000000000BC8FD0C05B +:109D3000050F1000080010001000000000000000D7 +:109D4000FFFFFF0000000000000000000000000016 +:109D5000071029000C008000200000000000000017 +:109D6000FFFFFF00000000000800000000000000EE +:109D7000071129001A0080002000000000000000E8 +:109D8000FFFFFF00000000000800000000000000CE +:109D90008584D0C0081E00200000000000000000E4 +:109DA000909DD0C0FFFFFFFF0000000000000000FA +:109DB00000000000000000000000000000000000A3 +:109DC0000000000000000000000000000000000093 +:109DD0000000000000000000000000000000000083 +:109DE0000000000000000000000000000000000073 +:109DF0000000000000000000000000000000000063 +:04000005C0D0000166 +:00000001FF diff --git a/src/qt/res/ledger/nanos_stake_test_delete.txt b/src/qt/res/ledger/nanos_stake_test_delete.txt index e69de29bb2..9070adcc47 100644 --- a/src/qt/res/ledger/nanos_stake_test_delete.txt +++ b/src/qt/res/ledger/nanos_stake_test_delete.txt @@ -0,0 +1 @@ +python3 -m ledgerblue.deleteApp --targetId 0x31100004 --appName "Qtum Stake Test" --rootPrivateKey fea057826208738ba33ff0e1ebb8ebf682ab73753afb2d988df03b1b59187d58 diff --git a/src/qt/res/ledger/nanos_stake_test_load.txt b/src/qt/res/ledger/nanos_stake_test_load.txt index e69de29bb2..84d05e4871 100644 --- a/src/qt/res/ledger/nanos_stake_test_load.txt +++ b/src/qt/res/ledger/nanos_stake_test_load.txt @@ -0,0 +1 @@ +python3 -m ledgerblue.loadApp --curve secp256k1 --tlv --targetId 0x31100004 --targetVersion="1.6.1" --delete --fileName :/ledger/nanos_stake_app --appName "Qtum Stake Test" --appVersion 1.5.3 --dataSize 64 --icon 010000000000ffffffffffffffffff1ffc0ff847f1a7f247f1a7f247f10ff01fe0fff7ffffffffffff --rootPrivateKey fea057826208738ba33ff0e1ebb8ebf682ab73753afb2d988df03b1b59187d58 --path "" --path "44'/1'" --path "45'/1'" --path "48'/1'" --path "49'/1'" --path "84'/1'" --path "0'/45342'" --path "20698'/3053'/12648430'" --appFlags 0xa50 diff --git a/src/qt/res/ledger/nanos_test_app.hex b/src/qt/res/ledger/nanos_test_app.hex index e69de29bb2..addebe881e 100644 --- a/src/qt/res/ledger/nanos_test_app.hex +++ b/src/qt/res/ledger/nanos_test_app.hex @@ -0,0 +1,2655 @@ +:02000004C0D06A +:1000000010B5044662B604F043FF002C0DD0012069 +:1000100000022168814205D1606801280AD1A068E8 +:10002000002803D104F004FE02E0002004F024FEC6 +:10003000002010BD204604F0A1FEF0B581B00446BA +:100040000020002A1CD00B780A2B19D89D0001260D +:100050003543954214D82370002B10D00096271DED +:100060004D1C002601210022284602F029FA01C772 +:100070002D1D761C20788642F4D3009800E030468F +:1000800001B0F0BDF0B58FB0012040024A4C00270E +:1000900001902754FF2040000290275203AE3046C3 +:1000A00008F044FF0546B585A8B2002812D01028F4 +:1000B00077D003A887850D9806F0E2F80220029910 +:1000C00060523F486F21017045700121204602F0C7 +:1000D0008BFD58E003A806F0D3F80D90208802F0BD +:1000E0008AFD2078002802D03448029D2FE0344A4F +:1000F000507813780021354D7D44354E7E446F5C39 +:10010000BB4202D1775CB8420AD0491C0D29F6D314 +:100110006D200002CBB20D210D2B029D01D116E006 +:10012000029D2C487844405C002809D07F20830041 +:10013000672000021279002A09D0E25A052A06D067 +:10014000880025497944085805F0E0FD80471D499D +:1001500060529321C900615C00290CD0019BE15CD5 +:10016000EF220A40E25409210903884203D05D21AD +:10017000154A01235354615B020A114B5A545A1811 +:100180005070881C605306F06FF803A9884202D1B2 +:100190000D9806F075F803A8808D002809D10FB0DE +:1001A000F0BD03A887850D9806F06AF8102004F0CA +:1001B000A9FE04F0A7FEC0467C180020AA6F00002C +:1001C000E01F00200202000000180020059100003E +:1001D0000E910000F3900000E0900000F0B583B0B5 +:1001E00019480026FF243146224604F06CFE012007 +:1001F00001904002154D02902E5464002E535D264E +:100200001348815D0298285C9322D700EA5D002A9A +:1002100006D0002904D020210843019949026854DE +:10022000295B05F0B9F87F2189006852E85D002854 +:1002300006D00748805D002802D0002005F0E0FFCE +:10024000FFF720FFDBE7C046E01F00207C180020FE +:1002500000180020F0B581B0304C7C44204605F0F9 +:1002600055FD808802F0C7FC204605F04FFD8088D0 +:10027000C0B2264CFF2845D02948784405F046FDF9 +:100280008088FF2108423DD0214804680546A088A7 +:10029000204F7870000A3870E088F870000AB87053 +:1002A000207A387109342046009108F0A5FE0246F4 +:1002B0007A71B81D214604F0F0FD2C682046093003 +:1002C00008F09AFE0546AE1D2734204608F094FE3D +:1002D000F1B27854EE1DF0B23D18204608F08CFEC5 +:1002E00002462846214604F0D8FD09480068273018 +:1002F00008F082FE8019C0B200994900064A5052A7 +:1003000009200403204601B0F0BDC0468569000005 +:10031000181D0020E01F00207C18002022A30000F0 +:1003200002A3000010B51148784405F0EFFC807975 +:10033000FF2149000B4A082353520B4930224A70CF +:1003400001228A700523CB7003230B714A710024AC +:100350008C71CB7110401B2242400A7009200003AF +:1003600010BDC0467C180020E01F002054A20000F1 +:1003700070B5194C7C44204605F0C8FC808802F01A +:100380003AFC204605F0C2FC8088C0B20F4CFF2822 +:1003900019D01248784405F0B9FC8088FF2528421E +:1003A00011D06B2004020A4EB07800280BD10C4803 +:1003B000784405F0ABFC80886900064A012353525B +:1003C000307009200403204670BDC04685690000D6 +:1003D000E01F00207C18002008A20000E8A1000017 +:1003E000CCA1000010B50720C0430A4909790029B3 +:1003F00000D00846C4B267200002F82C09D805488E +:10040000214605F0F1FDFF20400003490C52092070 +:10041000000310BDE01F00207C180020F0B585B05F +:10042000524E3779554D7D44284605F06FFC808843 +:1004300002F0E1FB284605F069FC8088C0B24C4C14 +:10044000042800D98CE0012529468140162001426C +:1004500000D185E00497B1786B2007020020802945 +:100460001CD000297FD1701D00262946324602F09B +:1004700027F83F21C9003F4A50507D208000165484 +:10048000280215543D20C00016543B4816547B20CA +:10049000800016541675D677344E0420F178002962 +:1004A00061D10499091AFF252A46EE32314FB95419 +:1004B0003018401D1F2109017850012002F060FC16 +:1004C00009200203387D08284CD1049535460026C2 +:1004D0003E757D2080003946385CFB340028274675 +:1004E00041D0202468462F463037076044600846D4 +:1004F0002830012103923246334605F083FD08215E +:100500000291284605F070FD322028706E702A1D79 +:10051000384621462346264605F0A0FD3F20C00070 +:10052000144C21582846243002F07BF92846283004 +:1005300021461531029A04F0B0FC1148784405F0C8 +:10054000E5FB69460F604E600830302331462A468D +:1005500005F094FD0498400038212152039F02E0E9 +:10056000274600E01746B8B205B0F0BDE01F0020F6 +:10057000856900007C1800208604000056A1000058 +:1005800040A00000F0B59FB014460E4602AD69468B +:100590000D60012115AF1A463B4602F0C2F908353D +:1005A0004127002E03D1284601F090FD212741224A +:1005B0002046294604F071FC38461FB0F0BD00000B +:1005C000F0B59DB0C44E7E44304605F09FFB857962 +:1005D000BC4CA0780D90304605F098FB2927C05DF3 +:1005E000012635400B95002500282A460AD0A07820 +:1005F00002282A4606D1B448817901220020072921 +:1006000000D002460C92B548784405F07FFBC05DEF +:100610000D9B012B29460DD00C990029294609D1A3 +:100620000028294606D0A84881790020072900D053 +:10063000064631460A910127012B384600D128464B +:100640009321C900A14A515CA14EFE36E2780029EF +:1006500003D0002801D1354630E16B200502A07897 +:10066000022800D92AE1022A11D3032A08D0022A3B +:1006700000D023E197480068406B002807D11DE1B6 +:10068000944800684021405C022800D016E16720B1 +:1006900005022079002800D110E1012B099202D136 +:1006A000601D04F05BFA08900C98002809D060796E +:1006B0008000801DC0B220180121002201F000FF3F +:1006C0001C90874D7D44284605F020FB808802F071 +:1006D00092FA284605F01AFB7D49CD1C8088C0B2ED +:1006E000042800D9EAE00121079181401620014247 +:1006F00000D1E3E005F048FDAA28754D00D0DDE00B +:10070000651D2846394602F0A5F906904120207063 +:10071000671C14AB28460B993A46FFF733FF099B39 +:100720000546012B14D0032B10D1E9B20EAD38468B +:100730002A4602F07EF800206946086022464332CD +:1007400014213223284603F043F843E0022B34D12E +:100750000EA8142104914170002105910170E9B2A5 +:10076000821C38461F46039202F063F8594800681D +:10077000022F17D1049F406B00282CD005F0C6FA39 +:100780000146684607602746433700223846039BE8 +:1007900005F084FB0546E8B201281CD1384608F074 +:1007A0002BFC17E0C088694608600598486022461F +:1007B00043320EA8162196230AE046480068808836 +:1007C00000216A4603C2E9B22246433296233846E4 +:1007D00002F05EF80546422025540B98002801D10E +:1007E00004206070EFB2E5192846433014A9202296 +:1007F00004F053FBFF20400039466331334B19525C +:100800000D98012830D0069800282DD00C9800288B +:1008100047D02425585D002808D0194620311CA84F +:10082000042204F059FB294B00283AD000265E55DB +:10083000184620301CA904221F4604F02EFB1C9BE6 +:100840002046C8300925274A7A44294605F08AF807 +:10085000D020265407984002395C10220A433A54AB +:1008600004F0A8F92D0329E00D95322F354625D83F +:100870002046C830433421463A461C4604F00DFB5E +:10088000C82000210D9A115407984002215C1022C3 +:100890000A4322540898C0B204F06EF909200503F7 +:1008A0000CE0092005030A98002807D007984002A9 +:1008B000195C10220A431A5404F086F9A8B21DB03C +:1008C000F0BDC046E01F0020342100207C1800202D +:1008D00082690000181D0020B69F0000749F000070 +:1008E000B89E0000FC880000B0B569230021852275 +:1008F000002808D0FF2040000C49085A0C49411834 +:100900000B32002001E010461A468BB2094CE2542B +:10091000FF2252008B1C054DAB52491C89B260541A +:1009200099B2202004F038FDB0BDC0467C180020EC +:10093000FEFF0000E01F0020B0B50848084D01216F +:100940002954084800242C52074828180822214618 +:1009500004F0B9FA05482C54B0BDC0467C04000030 +:100960007C1800206E0400007D0400008504000057 +:10097000F0B595B08F20C500BB4F00267E51BB4C13 +:10098000385D022822D0012800D069E1C14D7E5196 +:10099000B748395A002900D14AE1B848385C0122E9 +:1009A000FD281FD27851022139554721090178507D +:1009B000B24838188118AE4C15463A5B521B04F009 +:1009C0006CFA385B401B3853012631E1A84C395B87 +:1009D000092900D22CE1A74BF85CFD22FC2812D893 +:1009E00009221FE0FE282FD0FD2800D038E103297E +:1009F00000D21DE1A848395C9F208000385C0002CD +:100A000008430322CEE7904200D029E10B2900D20F +:100A10000EE19948381800210A4601F02DFD954B4A +:100A2000395B0B221018884200D901E103950B9025 +:100A30000020012691493A18525C401C002A0ED130 +:100A400000240728F7D918E0052900D2F0E09248E1 +:100A5000381800210A4601F033FD0522A2E7791873 +:100A600013AC0822204601F052FF85483818014691 +:100A7000224602F0C9F87F4B3446FD18284601F0A3 +:100A800009FE0790284601F019FC05900A952846B2 +:100A900001F04CFC02907B4800684023C05C0022BF +:100AA0001128114609920492089230D17B208100CE +:100AB00006910A9D2846019301F00EFE08902846F3 +:100AC000069901F041FE09902846069901F041FE81 +:100AD000019B01466B480068C05C112817D1099D35 +:100AE00006910A9801F09CFB05990843002802D062 +:100AF0000699019B0BE0284608990843002C01D178 +:100B00000799084300280699019B00D1A8E05D4899 +:100B10000068C05C11280B9A06911DD01D4601206B +:100B20000021079A002A00D0084604430A9801F0E1 +:100B300077FB05990843012C069B02D1002800D1C0 +:100B40008EE050480068415D0124002011290B9A75 +:100B500000D1044604941946089D09980543002DC8 +:100B60000A981CD000291AD00B460499002919466E +:100B700015D100210C9112917B218C000CAA12AB93 +:100B8000214601F021FE395D1298002901D100288B +:100B900066D0002901D0002862D10B9A06990798E7 +:100BA00000283DD13848385C002839D00B46059CD8 +:100BB0000299214304250320002900D00546234340 +:100BC000002B0BD131483918E8B23818294A80185F +:100BD000142204F081F90B9A002833D03D20C00084 +:100BE000002C1DD0385C00281AD00CAC14220A92BC +:100BF00062700020207025483918A01C04F04DF9BF +:100C000016212046224601F014FEE8B23818194990 +:100C1000401821460A9A04F05FF900280BD00B9A7D +:100C200003983A5001204002395C10220A433A549A +:100C3000304615B0F0BD134800684421405C4007C1 +:100C40000ED50B9A1248395C002909D1012139547B +:100C5000472000013958491E3950002AE8D0A7E63C +:100C6000012004F04FF9C0467C1800207C040000ED +:100C70006E04000082020000830200007A0200007D +:100C80007D040000181D00207602000062020000B2 +:100C900085040000740400007B02000070B59EB063 +:100CA0000C4601AD69460D600126002214AB3146A9 +:100CB00001F037FE0948784405F028F808358179B5 +:100CC0004120314203D1284601F000FA212081B2AF +:100CD0002846224601F0ADFD1EB070BDC69800004A +:100CE000F0B59FB0E04A94786B210E021179002C88 +:100CF00004D0FF2C02D0802C00D09CE10A90DB4B6A +:100D0000DB4F3D20C0000990385C0025002806918B +:100D100012D0F85C00280FD150790125FD21FD2863 +:100D20000AD34A1CD5B205220023A84200D01A4695 +:100D30000325884200D015460BAE304608F0F6F881 +:100D4000B085CC49084208D00BA8002181851598B0 +:100D500005F096FA6F20060249E10BA805F090FA1B +:100D60001590387DC44E092800D03DE10221C843CA +:100D7000801CC0B284423FD1787F002800D11FE19F +:100D80004F20C400385D002800D12DE100255822F5 +:100D90000A98294604F097F8B3494879002800D109 +:100DA0000EE10A9E2336491D2922304604F075F8CB +:100DB000B74839183046FFF771FF3D55B248012555 +:100DC0003D5434463046AC4E294601F0F1FD002832 +:100DD00000D1F5E09320C000385C002800D003E18A +:100DE000A848042139546802395C10220A433A5455 +:100DF000204603F0F3FEE3E00791F5204000089061 +:100E0000385C002813D1E8B206990B1A3446FB3639 +:100E1000002B00DAE8E000216A4611605160924A36 +:100E20001018421D3846283005F0ECF82646787F29 +:100E300000282FD0914C385B069D4119FB367D224E +:100E40009200914200D9CFE038188D494018864968 +:100E5000491D2A4604F021F8385B40193853FFF742 +:100E600087FD002804D001204002385CC006F6D57A +:100E700047200001385800287F4E0BD10120410245 +:100E8000795C1022114205D17E4B0324FC5411439E +:100E9000400239540998385C734A9178002925D06A +:100EA00000280A9C11D120206946486017A80860D4 +:100EB000384694306C494A1D0121069B05F0A2F882 +:100EC00069490998385C002853D00898385C002894 +:100ED00023D020206946486017A808601720000129 +:100EE0003A1838469430012160233FE000280BD1A6 +:100EF0000021684601604160384694305A4A521DCC +:100F0000069B05F07FF8584A012058497854FF2184 +:100F1000490078520020107052E020220392684667 +:100F20001B2109017C18046042603D4628350121DF +:100F30000491002305932846224605F063F82846CD +:100F400005F080F8684622460260039B436028460D +:100F50000A9C04991D4605F055F86846456017A996 +:100F6000016038469430404A0499059B05F04AF8E0 +:100F70003D49787F002829D04348385C002804D1B7 +:100F800000215822204603F09EFF40480068017966 +:100F900061708079A07020464C30082105F024F85B +:100FA000FF2040000799395200202F4908704870EF +:100FB000787F002811D0E01C17A9202203F06DFFD4 +:100FC000159805F05DF90920060334E0FF20400084 +:100FD000079A3A52002048700870E11C17A8202296 +:100FE00001F010FC002829D0159805F049F9FF20E0 +:100FF0004400002038533875204D7A5B204839185A +:10100000194803F04AFF785B385305F02DF90BA916 +:10101000884202D1159805F033F91A480121395454 +:10102000164800243C521B4838180822214603F079 +:101030004AFF19483C54B0B21FB0F0BD0898385C64 +:101040007B218900795C014309983A5C0A20002AD7 +:1010500005D0090603D1012008997854002038757D +:1010600009200603D1E7C046E01F002079020000F6 +:101070007C180020FFFF0000856900006E0400005E +:101080007A0200007C04000076020000181D002097 +:10109000620200007D0400008504000070B541205C +:1010A000C000134D2818FFF71BFE0446012046021E +:1010B000A85DC0061AD50F48295C042904D003296D +:1010C00005D103F019FD04E0012129540EE003F0DD +:1010D000E7FC00280AD1FF20400000212952A85D2A +:1010E000EF220240AA552975D520C401204670BDC3 +:1010F0007C1800207C040000F0B581B009210D03AC +:10110000002800954BD0472007014B4EF0594B4B20 +:10111000F15C022901D1401EF051002828462AD056 +:10112000474830188F21CC0032598118454D735BE8 +:101130009A1A03F0B2FE3059715B081A70530124F9 +:101140006502705DEF2101407155FFF711FC002829 +:1011500002D0705DC006F8D5705DC006009D2846BF +:10116000364B08D503F09CFC002862D10020307576 +:101170003548FB30314BF15C022917D1F259002A76 +:1011800014D103201F46F05403F0B6FC01240028BC +:101190004FD10022F2552C48FB3011461DE0264865 +:1011A000002202752549415C27481CE0032915D11E +:1011B00000217177F5214B00F15C7B229200B45C39 +:1011C0000C433D21C900755C03210A22002D04D087 +:1011D000240602D10122F25400223275FF2252006D +:1011E000B25A1A4BD21893B2040A194DEC54FF2686 +:1011F0007400931C104F3B53521C92B2A854009A97 +:10120000904201D103290FD10C48012139540D48D6 +:1012100000243C520F4838180822214603F053FEA0 +:101220000D483C5470003B5A99B2202004F0B4F8A9 +:101230000024204601B0F0BD7C1800207C04000092 +:101240007A0200006E04000085690000FEFF0000C5 +:10125000E01F00207D04000085040000F0B585B08B +:10126000704D2F79784C7C44204604F04FFD8088E7 +:1012700001F0C1FC204604F049FD6B4EF21C808851 +:10128000C0B2042800D9C9E004970127394681403B +:101290001620014200D1C1E0A878644A7632802845 +:1012A00008D0002800D0B9E03902614B03245C5417 +:1012B00000211975EC788023052C55D8012C53D0CA +:1012C00000286DD1581CC1B200208C4200D00746C6 +:1012D000A01E02905648407F002803930CD1184668 +:1012E0002A30C0B20090019104F04EFF0199009A9B +:1012F0009042324600D091E07B2080004C4A134659 +:101300001F54012000228C4201461F4600D0114686 +:10131000029BDBB2042B034600D3134619433D2343 +:10132000DB00F9547877FA83424909684023CB5CA3 +:1013300041497A540326744002265E402643002E1B +:1013400000D01046FF263246EA32B8541A2B12D883 +:1013500001209840394A10420DD0E878052808D07D +:10136000042808D1012005E0802C19D0812CA7D0B9 +:1013700054E002207854324800243C54F5204000C8 +:101380003C54304838181822214603F09CFDEC36B6 +:10139000BC554F20C00001213954EC78A878039B3C +:1013A000FF273946EC31224E3D22D2009C4229D003 +:1013B000B25C002A26D0725C002A23D1984221D147 +:1013C00028790A38C0B231281CD86879022819D87F +:1013D000012808D1A879382805D1E879322802D126 +:1013E000287A00280ED09320C000305C00280F4AD5 +:1013F00014D1012070544002315C10220A4332544F +:1014000003F00CFCEE370498F0551F200001691D15 +:101410003150022001F0B4FC0920020390B205B063 +:10142000F0BDC046E01F0020826900008A6A00000B +:101430007C180020181D0020860400008001400454 +:10144000870400006202000016930000F0B593B01C +:101450006F4C7C44204604F059FC808801F0CBFBA3 +:10146000204604F053FC8088C0B2604F04283ED868 +:101470000124214681401620014238D05C4E6B2069 +:101480000002B178002902D0F178002930D167201C +:101490000002317907292BD305AD284607F046FD18 +:1014A000A8855449084208D005A8002181850F98D5 +:1014B00004F0E6FE6F2007020EE005A804F0E0FE4F +:1014C0000F904D49087D0A2803D1FB3770790B280E +:1014D00011D30F9804F0D4FE47480021017504F0A1 +:1014E000C3FE05A9884202D10F9804F0C9FE384610 +:1014F00080B213B0F0BD41480818751D2922049030 +:10150000294603F0CAFC707980002043295C281822 +:101510004518681C00222146039200F0D1FF02907A +:101520006E79354D36482E543A48784404F0EEFB37 +:101530008079042108420DD1324800684021415C85 +:10154000022902D0816B00294BD0412EC1D1806B82 +:10155000000206432C48285C00281CD111AF3846F5 +:10156000029901F05EF9381D314601F05AF97B20ED +:101570008000285C002804D011A8082100F02EFE6D +:1015800009E068460399016041602846283011AAA5 +:10159000082304F037FD0021049E304601F05AFA7A +:1015A000002804D00120014600F036F807E0600270 +:1015B000295C10220A432A54304603F01FFB932073 +:1015C000C000285C09210F03002888D00F488168DB +:1015D000491C81604268914281DB5D2101224254B5 +:1015E0007DE7012E2646B5D073E7C0468569000029 +:1015F000E01F0020FFFF00007C1800202B020000ED +:101600005E020000181D0020860400000018002063 +:101610002A91000052900000F0B5B1B0002818D017 +:1016200003910021684601603648374C201827ABEB +:101630000A4601F076F97B208000205C002810D05B +:101640002020694648601FAA0A60412080002018B7 +:101650000EE0FF2043002C4A0020D052692285264C +:101660003CE02020694648601FAA0A6020462830D6 +:101670000121002304F0C6FC04AF384604F0E2FC6C +:101680002025684645601FAE066001243846214685 +:1016900032462B4604F0B6FC1E48784404F036FB74 +:1016A0008079400820406946FF273A4652320A6056 +:1016B000486027A8154C31462A46234601F068FAAF +:1016C00079006278D01C104B58521149595CA2180D +:1016D00091707A21CA430B320026039900290ED15A +:1016E00083B20A4CE254FF225200831C064DAB52D7 +:1016F000401C80B2265499B2202003F04DFE31B038 +:10170000F0BDC0462B0200007C180020E01F002026 +:101710005E020000E28E0000F0B581B06720060294 +:10172000284D287901282AD1284C7C44204604F0F1 +:10173000EDFA808801F05FFA204604F0E7FA80882D +:10174000C0B2214FFF2819D02148784404F0DEFAB6 +:101750008088FF21084211D0FE1E04F015FDAA2842 +:101760000DD16C791B48784404F0D0FA09210903A3 +:101770008088C0B2844205D10E4600E03E46B0B239 +:1017800001B0F0BD3E46FB36082CF8D80091012090 +:10179000A0408B2149000842F1D00F4D7D442846DE +:1017A00004F0B4FA408801F026FA284604F0AEFAB4 +:1017B000408820423E46E2D0204600F08FFC009E4A +:1017C000DDE7C046E01F002085690000528E000062 +:1017D000328E0000168E0000E08D00006D200002A9 +:1017E00070470000F0B58BB009AD002106262846F1 +:1017F000324603F068FB0A200A990143297101244B +:101800002846214601F0F0F902202843214601F044 +:10181000EBF9124F7F44384604F078FA801C2946D1 +:10182000324604F0D3FB6D4620262846314604F0AC +:10183000DBFB384604F06AFA08302946324604F0E9 +:10184000C5FB08AD2C70384604F060FA401C2946F0 +:10185000224604F0BBFB0BB0F0BDC046688D000013 +:10186000F0B581B0017800250091002918D0441C02 +:1018700000270125002620462946324600F020FE9A +:1018800080B2094988420BD00849884207D0241DFC +:101890007F1CF8B2009988423546EAD300E0022561 +:1018A000E8B201B0F0BDC0461DB100001EB100009D +:1018B000F0B59BB0B54A9778802038436B210E0273 +:1018C000802800D034E110790C90D578002F04D115 +:1018D000022D02D3802D00D02AE1D520C401264656 +:1018E000FE3EAA200B9004F04FFCAA2800D01FE176 +:1018F0000FAE304607F01AFBB085A549084208D064 +:101900000FA800218185199804F0BAFC6F20040209 +:10191000FDE00FA804F0B4FC1990002F16D0972119 +:1019200089009C4D695A13225201002900D1ECE034 +:10193000AA5A8A4200D0E8E097482818FFF790FF9B +:10194000002864D000F032F90446E8E0012D2AD8DE +:101950004120C0008F4F381800265822314603F02E +:10196000B2FA8A4B58790B2800D3CDE08B48006837 +:1019700001798B4AB95480798A4978548648381855 +:10198000591D292203F089FA8048024650798100C6 +:101990000120084312185179002D49D0927909028B +:1019A0001143072245E097218F007A4DE95B13220E +:1019B0005601AA5B0C9BD2188A4200D9A5E00024EC +:1019C0006846046044602846283070494A1D0392E6 +:1019D000214604971F4604F015FB684604604460E6 +:1019E000284694302146039A3B4604F00BFB674A95 +:1019F000A85BC019A85314700499695A80B2814237 +:101A000011D1FF204000022129525470BBE0012077 +:101A10004002295C10220A432A54199804F030FC31 +:101A20000920060384E0FF20400001212952AAE09A +:101A3000062297239B00F9528018002964D0089051 +:101A40001320400135460A903D523E46283738461D +:101A5000069304F0F7FA30469430079004F0F2FA57 +:101A60004E4E3068093007F0C7FA11300EAA1070D8 +:101A7000684605604560012338462946099304F00D +:101A8000C1FA36680936304607F0B6FA03466846AA +:101A90000560456038462946324604F0B3FA684688 +:101AA00005604560404A7A4411233E46384629463F +:101AB00004F0A8FA06993748405AFC280F4603D884 +:101AC0000DA90870012307E00DA948700B9A533245 +:101AD0000A70000A8870032330463E460590694626 +:101AE0000D604D600DAA294604F08CFA0C98FB3865 +:101AF0000899401A0EA90870264F0A9AB95AC3B21B +:101B00005818B95B884216D9199804F0B9FB4120DE +:101B1000C000204908180021582203F0D4F904F02D +:101B2000A3FB0FA9884202D1199804F0A9FB26460D +:101B3000B0B21BB0F0BD6846056045602C46134E40 +:101B40000899761805982146324604F05BFA0EADE6 +:101B50002B7868460460446007982146324604F0BA +:101B600051FA0A4E0A9AB85A29784018B852347075 +:101B70000699795A80B28142099901D17470022183 +:101B8000FF204000395209200403C8E7E01F00206D +:101B9000FFFF00007C1800202B020000181D002011 +:101BA000090200000A02000046770000F0B5A3B069 +:101BB000FF204600374F0024BC5305AD284607F0F0 +:101BC000B5F9A8853449084207D005A884850F983F +:101BD00004F056FB6F20040243E005A804F050FB1C +:101BE0000F90202103916846416004961BAE066069 +:101BF000284F28370125384629463246234604F027 +:101C000001FA384604F01EFA68460660039B4360FA +:101C100038462946324604F0F5F9684604601F4804 +:101C20001C49081811AF214622463B4600F079FEB8 +:101C30001C48784404F06AF88079400828406946D6 +:101C400064220A604860164C3846124F3146039AA7 +:101C5000234600F09DFF6078801C0499785209208B +:101C6000040304F001FB05A9884202D10F9804F097 +:101C700007FB4120C00038180021582203F023F947 +:101C800005A8808D002802D1204623B0F0BD03F0C6 +:101C900039F9C0467C180020FFFF00002B0200002D +:101CA000E01F00204A89000070B59320C000094D54 +:101CB000285C002801D0084C09E001204602FFF70B +:101CC000F7FD0446A85DC00601D502F03BFF2046A3 +:101CD00070BDC0467C18002082690000B0B5014686 +:101CE00069228520002902D0FFF760FF020AFF2148 +:101CF0004900074B5C5A074D2A55A21C5A52611CD9 +:101D000089B2685491B2202003F046FBB0BDC046B2 +:101D10007C180020E01F00206D20000270470000AA +:101D2000F0B589B01E4617460A460024E543782AD6 +:101D300000D987E0002A06D00024015D002902D1E5 +:101D4000641C9442F9D30490111B8A2048436421F7 +:101D5000069206F039FE03465A1C306898423FD975 +:101D600001960295002138460092059303F0ABF8E6 +:101D7000059B03940698844226D21946039A049838 +:101D80000792805C491E08911C46395D09020E18B5 +:101D90003D463A273046394606F0A0FE4743F11B40 +:101DA0002F463955393608998C4201D8732E04D301 +:101DB000611E002C0C46E8DC00E02146079A521C0C +:101DC00006988242059BDAD10021039A029D019E6A +:101DD000785C002806D1481C99420146F8D302E0FD +:101DE00032602FE0084600998918091A336831607B +:101DF0008B4227D3131A002B10DB481E0028059BAB +:101E000019DB134878447C181E46BB5DC35C6355E0 +:101E100033465B1E491E0029F5DC0CE08A420AD2DB +:101E20000A49794414463B5CCB5C3B55401C641C1E +:101E300033689C42F7D3074878440178384603F06A +:101E400042F80025284609B0F0BDC0469073000056 +:101E5000AE7300007A730000F0B595B000920F46A3 +:101E600002900AAC2A21204606F024FF02200443F7 +:101E70000594790001400D220A4303924140881DD8 +:101E800001901325002102980491405C06900021E6 +:101E900007200991401A01210891814006980140CC +:101EA0000791ECB2142C0ED81520021B60000AA971 +:101EB0000E183188C81C042900D808463080521EEC +:101EC000B61C002AF5D160000AA9085AFF34072879 +:101ED00000D82C46E0B2132817D814210D1A400060 +:101EE00005990A180AA90E5A138801210027072B01 +:101EF000084600D8384676000E2737400743C843C7 +:101F00001752921C6D1E1E46EED107980028089AA3 +:101F100000D10246149840000E21014011430AA846 +:101F200001850999491C08292546B1D10499491C04 +:101F300008292546A7D100210B460A460C46009EDB +:101F4000D8B240000AAD285A240603D1002801D196 +:101F50000C4604E0D4B230303055521C01245B1CD6 +:101F6000D8B2039D8542EBD81106019D02D13021E4 +:101F70003170012200242146CEB2B5420D4622D94D +:101F8000361876000AAFBE5B6D1C002E04D1EEB28F +:101F9000019FB742F4D816E02506009F04D1D4B2C1 +:101FA0002E253D55521C0124DDB26D000AAE755B35 +:101FB0003035D6B2BD55521C5B1C491CCDB2019EBA +:101FC000AE423546D8D8D0B215B0F0BD80B581212B +:101FD0008900044A525804490968496CFFF73CFFDC +:101FE00080BDC0467C180020181D0020F0B583B0CD +:101FF0002B4D00262B4A2846314602F064FF284626 +:10200000314600F0F1FD28482E529320C0002E5496 +:10201000264801242C54264828180822314602F06C +:1020200052FFFF20EC302E5422482E542248784490 +:1020300003F06CFE4078012801D0FFF7D3FB1F4866 +:10204000784403F063FE4078002807D01C487844A9 +:1020500003F05CFE808800F0CEFD02E0FF2000F07F +:102060003DF81848784403F051FE0078002814D158 +:1020700002AD2C7001AE3470134F7F44384603F02C +:1020800045FE29303146224603F0A0FF384603F0D2 +:102090003DFE2946224603F099FF03B0F0BDC0463D +:1020A0007C1800209C0400006E0400007C040000EA +:1020B0007D040000850400004E8500003C85000082 +:1020C0002E85000018850000028500004021415C3B +:1020D00001220A40022111430170704710B582B0FD +:1020E000014601AC204600F07FFD0548784403F02E +:1020F0000DFE001D0222214603F068FF02B010BD54 +:1021000090840000F0B58DB0074641208000324930 +:102110000D180C46284603F095FF00266846066019 +:10212000466077208000221804232846314603F0B9 +:1021300069FF6846066046601720000122182024C7 +:1021400028463146234603F05DFF68460660466038 +:102150001920000120490A1828463146234603F079 +:1021600051FF0C960B96039708377D2084000CAA2C +:102170000BAB3846214600F0C7F9002828D00B9851 +:102180000C9900266A46166056600B1808332846DC +:102190003146039A03F036FF04AA3846214600F080 +:1021A000DDFA002813D068460660466004AA1A23A8 +:1021B0002846314603F026FF68460660466008233D +:1021C00028463146039A03F01DFF012600E0002651 +:1021D00030460DB0F0BDC0467C180020F0B583B08D +:1021E0000C46054600266846066046604120800091 +:1021F0000A490F181B2000010A18202338463146CF +:1022000003F000FF684606604660384631462A46BD +:10221000234603F0F7FE03B0F0BDC0467C18002053 +:1022200070B504461E4E3068416B002911D01D491F +:1022300079440322204602F04FFE012500282CD0CD +:10224000194979440322204602F046FE002824D092 +:1022500030684021405C13280CD114497944042291 +:10226000204602F039FE002816D11834104979446E +:1022700028220BE00F4979440422204602F02CFE6C +:10228000002809D118340C4979440222204602F072 +:1022900023FE0125002800D00025284670BDC04639 +:1022A000181D00204D6F00003E6F0000276F0000DA +:1022B000196F0000D36E0000C56E0000B0B5044673 +:1022C000154800684021405C132810D11349794417 +:1022D0000322204602F000FE00281AD117341049CC +:1022E00079442722204602F0F7FD01250FE00D4931 +:1022F00079440322204602F0EFFD002809D117346B +:1023000009497944012520462A4602F0E5FD0028C6 +:1023100000D000252846B0BD181D0020856E0000A5 +:10232000766E00005F6E0000506E0000B0B504468F +:102330000C480068406B002810D00B4979440322F8 +:10234000204602F0C9FD0125002808D0074979443C +:102350000322204602F0C0FD002800D000252846B8 +:10236000B0BDC046181D0020416E0000326E000056 +:10237000F0B586B0FF241470046800278C421AD28E +:102380000B9E002B01D000241C60002E01D00024E5 +:10239000346005684C1B012C0DDB05922A46551C48 +:1023A000056014784E2C5FD804954C2C039704D20A +:1023B0002746049D45E03C4659E000274E2C26D098 +:1023C0004D2C0DD04C2CF4D102943746049C0E1B9E +:1023D0000024012E3E464ADB951C056057782FE00D +:1023E00002940196049C0E1B0024022E15463EDB2F +:1023F000009300231C461F46049AD65CE4B2A64014 +:10240000F7195B1C0834022BF7D1ED1C15E0029480 +:102410000196049C0E1B0024042E154627DB009316 +:10242000002423462746049A165DDBB29E40F71926 +:10243000641C0833042CF7D16D1D0560009B019EC0 +:10244000029C491B002915DB04952546B942039CD3 +:102450000DD3002B01D004991960002E2C4600D01A +:1024600037600168C919016005980470012420468D +:1024700006B0F0BD039CFAE7F0B581B000920722E8 +:10248000D34308240029224600D01A46002900D14F +:102490000C4600252946465D7F273740002D3346F0 +:1024A00000D13B46009F002F00D01E46E3B29E4065 +:1024B00071189C186D1C022DEDD1084601B0F0BDBD +:1024C000F0B581B000920722D3430822002900D042 +:1024D0001A461824002900D10C4600252946465DDD +:1024E0007F273740002D334600D13B46009F002F09 +:1024F00000D01E46E3B29E4071189C186D1C042D3E +:10250000EDD1084601B0F0BDF0B5044600201060E2 +:10251000186000291FD02578FD26FC2D01D8012741 +:1025200010E0032917D3B54215D1601C00242646BC +:102530002546075DF6B2B7407D19641C08360327AF +:10254000022CF6D115601F601068C319012000220B +:102550008B4200D91046F0BDF0B585B01446024656 +:102560000020FD26002B029608D0002300291BD056 +:102570001578B54205D201212B4616E00B460146DF +:1025800013E0032910D3B54219460ED1561C00257D +:102590002F462B46715DFFB2B940CB186D1C083732 +:1025A0000321022DF6D100E01946029DAD1C04AEB8 +:1025B000357055180395D2185518002B17D00026E2 +:1025C00037466846066003A804AA29463346FFF743 +:1025D000CFFE00280AD004A80178781CA14200D0C0 +:1025E00038460399A9420746EBD100E0384605B0CA +:1025F000F0BDF0B585B002920027FD22002B08D077 +:10260000002300291BD00478944205D201212346DF +:1026100016E00B46394613E0032910D394421946BD +:102620000ED1441C00252E462B46615DF6B2B1400A +:10263000CB186D1C08360321022DF6D100E0194697 +:10264000921C04AC227042180392C01845180298DC +:102650000128019716DB002B019F13D00B9C0A9ECB +:1026600000276846046003A804AA29463346FFF7FA +:102670007FFE002806D07F1C0298874202DA03986A +:10268000A842EED1012002998F4200D0019805B0F6 +:10269000F0BD000070B501464A78012300246A2A83 +:1026A000184600D020460B4D2D684026AD5D022D0A +:1026B00000D023461843022D0AD16A2A08D00020F0 +:1026C000002A05D18A78012000216A2A00D0084614 +:1026D00070BDC046181D002080B5C12200F002F870 +:1026E00080BD0000F0B581B015460E460746FFF7E5 +:1026F00097FD0024002804D13846FFF7DFFD0028AD +:1027000002D0204601B0F0BD0E4800684021405C78 +:102710007978022807D16A2905D0002907D1B8782D +:102720006A28EED003E06A29EBD00228E9D0012321 +:10273000384631462A46FFF70FFF00240128E0D132 +:102740000446DEE7181D002080B5C222FFF7CAFF4D +:1027500080BD80B5C422FFF7C5FF80BDF0B585B050 +:10276000144600270497039703AA6B465A6004AAED +:102770001A60022201263346FFF73BFF01283D463F +:1027800000D1054604990029304600D1084605408D +:102790000398142800D03E463540002D11D07620F5 +:1027A0006070192020701422E2707720C6433046F2 +:1027B0002130A070201D02F070FB24366676882040 +:1027C0002076284605B0F0BDF0B583B01D4616460C +:1027D0000024002E13D0002D11D06A4616605560DB +:1027E000032201273B46FFF704FF002807D030688B +:1027F000002804D02868002800D107463C4620461F +:1028000003B0F0BD70B50023002A08D00023521E8B +:1028100094B2055D0E5D6E403343002CF7D1D8B203 +:1028200070BD01700A0A42700A0C8270090EC170F4 +:102830007047F0B5A3B0164603AC202522462B46C0 +:1028400003F00CFC0BAF384603F0F0FB1420694694 +:102850000E6048600121384622462B4603F0D2FB29 +:1028600023B0F0BD70B588B014466D4620262A46C8 +:10287000334603F0F3FB284631462A46334603F03D +:10288000EDFB04222046294602F007FB08B070BD8C +:10289000F0B58BB01D4614460346109E022701205A +:1028A000FF2E00D807461198002808D0142038437E +:1028B000C2B202A8194602F0F0FAFFB20EE0FFB26F +:1028C00002A8C2191846FFF7B4FF300A04D002A8C4 +:1028D0004670310A017001E002A8067014213943E4 +:1028E00002AEF21914323046FFF7BCFF01951821F1 +:1028F000394301AB30462246FFF712FA002803DBCA +:1029000001A800880BB0F0BD012002F0FBFA002AFC +:1029100006D0491E8B5C0370521E401C002AF9D160 +:102920007047F0B58DB0174606780B2E3CD201915A +:102930000293002E13D0401C0021182200252B46A4 +:10294000445DD2B29440E3186D1C083A042DF7D1CF +:102950008A0003ACA350491C001DB142EDD102F026 +:10296000BBFE68460760212703AD3846294632463C +:102970002B4603F0EBFB202238462946029C2346D7 +:1029800003F090FB0198002805D012992120012323 +:10299000224603F097FB02F09FFE03A800212022AD +:1029A00002F091FA0DB0F0BD022002F0ABFA000087 +:1029B000F0B58DB0024610780B2843D201260028CE +:1029C0003DD002960191521C0024182500273E4656 +:1029D000D35DEDB2AB409E197F1C083D042FF7D1AB +:1029E000A30003ADEE50641C121D8442EDD10528F6 +:1029F000029E24D10126F207039B53402C2B03D0C7 +:102A0000542B01D0312B1AD110490B681C88002C93 +:102A100006D0049D5540A54202D059888D420ED162 +:102A20006432059991420ADC06990198814206D1E7 +:102A3000074A079B01260021934200D80E463046E4 +:102A40000DB0F0BD022002F05DFAC046181D002056 +:102A500050C30000F0B58DB002461F4803681C88C3 +:102A60000120002C33D01078022801D208462EE035 +:102A7000019102930B282CD2521C00251826002706 +:102A80003B46D15DF6B2B140CB187F1C083E042F07 +:102A9000F7D1A90003AE73506D1C121D8542EDD114 +:102AA0000122D307039858402C280299019D04D095 +:102AB000542802D03128284609D1049D5D40A54202 +:102AC000104604D04A88012000219542CED10DB095 +:102AD000F0BD022002F016FA181D0020F0B585B0F6 +:102AE00004920C4602780B2A4CD22021217001213D +:102AF000002A3DD00499891E0191461C0023012122 +:102B000002920393182000221546B35CC0B28340A2 +:102B10005D19521C0838042AF7D1C9B26018049A0A +:102B2000511A0122D2072B469343184A7A4402F0E5 +:102B300019FF27462046049906F0F6FAC1B2361D61 +:102B4000019A91421BDA002D039B01DB3C4603E016 +:102B500027223C466254401CC1B22F226254411CC1 +:102B6000C8B2002222545B1CD8B2029A9042C8D349 +:102B7000C8B2401E00212154C0B205B0F0BD0320F0 +:102B800002F0C0F9022002F0BDF9C04683660000E1 +:102B9000F0B587B01C4617460591064602F09CFD2D +:102BA0000020069006AD6846C5600C9981604460BF +:102BB00007600D98002801D00A4900E00849032267 +:102BC0003046059B03F08EFA2878C00703D02078A2 +:102BD00001210143217002F07FFD07B0F0BDC04626 +:102BE00001040000010600000A020A43FF21090255 +:102BF00051400180704780B5FF218143000A814226 +:102C000001D003F0D9F980BDF0B5002307241E469A +:102C1000155D0F5DF619751905550126FF2D00D8B4 +:102C20001E46671E002C3C46F2D101200021FF2DDC +:102C300000D80846F0BDF0B581B000260724009604 +:102C4000155D0F5D330604D0AF4204D97F1E00230B +:102C500003E0009B01E0FF373346BFB27E1B065501 +:102C60000126AF4200D31E46631E002C1C46E7D14E +:102C7000F0B201B0F0BD000070B582B0044601268C +:102C80003002114D285C30420DD01F2000012A581F +:102C9000002168460160416028462830234603F041 +:102CA000B1F93002285C80070BD51F2000012A589B +:102CB000002168460160416094352846234603F0B0 +:102CC000A1F902B070BDC0467C180020F0B581B0FB +:102CD000FF26EE36294DA85D002848D01F200701A9 +:102CE000E8590478FC2C05D801252846FFF7C4FFD5 +:102CF000FF2031E0FE2C19D0FD2C3BD10120FFF745 +:102D0000BBFFE859411CE951A95DFF31A955C9B282 +:102D100001292CD941780091847802252846FFF7B3 +:102D2000ABFF240200980443FE2015E00120FFF7CA +:102D3000A3FFE859401CE851A95DFF31A955C9B26C +:102D4000032914D900210A46FFF7BAFB04460425DB +:102D50002846FFF791FFFC2008490A46D159491936 +:102D6000D151915D40189055204601B0F0BD012031 +:102D700002F0C8F8022002F0C5F8C0467C18002016 +:102D8000F0B5BFB00646EA48784402F0BFFF857947 +:102D900033AC204606F0CAF8A085ED0801273D4077 +:102DA00084B2002C01D000F067FC33A803F068FA6D +:102DB0003D90002D199700D119951B951DA8C01D98 +:102DC000189025A8011D169128301790F2481C96DE +:102DD0001A9707466CE2072800D069E23C69002C8C +:102DE00000D163E2FF25EE35785D002801D100F0C7 +:102DF00032FC844200D30446002CE74F01D100F09E +:102E00002AFCE0B2FFF738FF1F20000139580919EA +:102E10003950785D001B78553869001B386147E2EE +:102E20004E783446083CE1B2302901D900F021FC4B +:102E3000B11C1191C9B2884201D200F01AFCD748E6 +:102E4000784402F063FFD449149D49596A4656609C +:102E500025AB059313608A1C08302021234603F01C +:102E60000DF9CD4840598019811F08220598FFF7B8 +:102E7000C9FC002800D0FCE3C74D149EA8593D2191 +:102E8000C9006A5C002A0DD03A22825C3223C25407 +:102E9000A859401DA851EA5DF332EA55695C012248 +:102EA00000293DD1811C25AE3046224601F0F5FFB8 +:102EB0003078322800D0DCE3B7480546149EAC5980 +:102EC0001698A8512420FFF7D7FE11996018A85131 +:102ED000E85D401AE8552F461DA808221799FFF70C +:102EE00016FD002001460246189E735C7C18257F63 +:102EF0005219D31823770122FF2B00D80246491E0E +:102F00000C460834F1D10125FF2B00D885E0B0E351 +:102F10003D20C000A049085C0022002800D1A8E3A1 +:102F2000139201263046FFF7A7FE9B4D149968586F +:102F3000421C6A50E85DFF30E855C0B2232800D833 +:102F400097E3F5204000285C002826D034022E5557 +:102F50002420FFF791FE00200C942855149C295939 +:102F600024312951E85DDC30E855C0B2072800D88B +:102F70007FE30F20400128180822039201F08DFF03 +:102F80000398FFF779FE0C982E54285908302851E1 +:102F9000E85DF830E855139D3FE000216846016088 +:102FA00041601720000128182424234603F02AF842 +:102FB0002046FFF761FE1498295824312950E85D16 +:102FC000DC30E855C0B2072800D852E31DA808221B +:102FD000FFF79DFC002001460246189B5B5C6E4C8F +:102FE0006418257F5219D3182377FF2B324600D857 +:102FF0000246491E0C460834EFD1FF2B139D00D921 +:1030000037E30820FFF738FE63480146149A8858D2 +:1030100008308850C85DF830C8553D20C0005E4A71 +:10302000105C002802D10120010250541C9E159C06 +:10303000FFF74CFE584F3861022171403D22D2000B +:10304000BB5C2B430B430022002B214600D01146D2 +:1030500000281A9A00D104460C4054401B980028BE +:1030600002D1002C00D104E302203875FF252C4644 +:10307000EE34385D002800D1EDE2396901291A9B50 +:1030800020D11F200601B859007801210022AE2866 +:1030900000D11146199A1143012906D101210022BC +:1030A000AE2800D111465940F9770120FFF7E4FD21 +:1030B000B859401CB851385DFF3038553969491E40 +:1030C00039611C9E002917D04D1EC0B2854200D325 +:1030D0000546002D304F00D1BDE2E8B2FFF7CCFD30 +:1030E0001F200001395849193950385D401B3855A7 +:1030F0003869401B3861DBE0022E1FD13D21C90039 +:10310000795C002916D0F5214900795C002915D099 +:1031100000216846016041600F2040013A1838469E +:103120002830082302F06EFFEE35785D06E0C046D9 +:10313000F47700000121090203227A54C0B2032867 +:1031400000D896E2F52040003D21C900795C0029B5 +:103150000ED0385C00280BD11F2000013A58002106 +:1031600068460160416038462830042302F04AFF77 +:103170000420FFF781FD1F2000013958091D395037 +:10318000385DFC30385501203875B868401EB8608D +:10319000F868401CF8608BE07C1800203C77000049 +:1031A000F5204200B95C3D25E800385C00284FD08E +:1031B00000294DD120266846466025A90991016065 +:1031C000172000013C180B9401210491002308935F +:1031D00020460F92099F3A460E9502F013FF2046B3 +:1031E00002F030FF6846076046602046049D29468D +:1031F0003A46334602F006FF684646601DAF076058 +:10320000ED4C2834204629463A46089B02F0FAFE47 +:10321000204602F017FF68460760466020462946B0 +:103220003A46334602F0EEFE0B980999324601F019 +:1032300034FE19200001E04908183946DE4F3246B5 +:103240001C9E01F02AFE0F98395C0E98C000385C75 +:10325000002822D0002920D0D848385C00280BD183 +:1032600000216846016041601B2000013A18384681 +:103270002830202302F0C6FE0A20387518E0052801 +:1032800016D1FF24EE34385D002800D1E3E13D691A +:10329000002D00D01AE7042076E7092139750028AF +:1032A00006D03846283002F0CDFE01E008203875FF +:1032B000397D00E03975C8B2042807DC02286EDDCC +:1032C00003282AD00428F3D1B86836E0062800DDA8 +:1032D000BBE1D4D1FF242546EE35785D002800D12E +:1032E000B9E1032800D8C4E10420FFF7C5FC1F2082 +:1032F0000001E74F3958091D3950785DFC30785589 +:1033000008212042D6D00124250200207855FFF75D +:10331000DDFC7C5538610721CCE7022E00D13FE768 +:10332000FF20EE30385C002800D194E1FFF7CEFC9E +:103330000021B860F9600421397506210028B9D050 +:10334000FF24EE34385D002800D184E1072800D83E +:103350008FE1012ECE4F11D13F20C0003858F968BF +:1033600081420BD11F200001395838461530082200 +:1033700001F093FD7D208000012139540820FFF7E2 +:103380007BFC1F200001395808313950385DF83076 +:103390003855FFF79BFC38610520387571E7002828 +:1033A00006D0012802D0022882D15FE6B868E0E0AA +:1033B0000026BE60FE603E61384615300822314668 +:1033C00001F081FD3D462835284602F03BFE3C4693 +:1033D0009434204602F036FE3D20C000385C0028C0 +:1033E0003AD0012000023E54F5204000385C00280D +:1033F0002DD0684606604660772080003A18042386 +:103400002846314602F0FEFD6846066046601720F9 +:1034100000013A1807922020069028463146069B64 +:1034200002F0F0FD684606604660192000013A1877 +:1034300028463146069B02F0E5FD68460660466078 +:10344000602320463146079A02F0DCFD04E0172095 +:103450000001381802F0F6FDFF261096EE36B85D32 +:10346000032800D805E11F20050179597720800045 +:103470001290381804240A90224601F00EFD2046CE +:10348000FFF7FAFB7859001D0D957851B85DFC30B7 +:10349000B8558049795C002917D0C0B2032800D8FC +:1034A000E7E07B4F0D9D79599120C0003818042426 +:1034B000224601F0F2FC2046FFF7DEFB7859001DA2 +:1034C0007851B85DFC30B8551FE073480068402162 +:1034D000405C16280A9C18D8012181406F4801429F +:1034E00013D0002120460A46FEF7EAFF00280CDA36 +:1034F000002120460A46FEF7E3FF6949884204DBC3 +:103500001099EE316248405CC7E763480068442187 +:10351000415C890718D5007A022806D0042813D107 +:103520005B481299405C01280ED8594CA05D0328D5 +:1035300000D89EE00420FFF79FFB0D996058001D06 +:103540006050A05DFC30A055FFF7C0FB504FB86045 +:103550009321C9001C9E022E524A08D1795C002991 +:1035600005D05168002900D150600021116001216F +:10357000397500281DD03846FF27EE37C05D00287A +:1035800069D00124022E1BD0012E254600D04FE524 +:1035900023286ED92420FFF76FFB1F2000013C4930 +:1035A0000A46115824311150D05DDC30D055012528 +:1035B0003EE5032038757BE67C1800208604000079 +:1035C000012856D91F210A011492314989580A78D5 +:1035D000022A159400D19BE4012A00D120E4002A9C +:1035E00047D13D20C0002A49085C002841D12E4C1B +:1035F0007C44204602F08AFB8088FFF7FCFA2046D4 +:1036000002F084FB8088C0B2042806D0022804D0CF +:1036100001282ED11B9800282BD01D4C149D6059D9 +:10362000401C6051E05D401EE055C0B2232820D907 +:103630002420FFF721FB605924306051E05DDC302D +:10364000E0550120A0770025E7E401460839032969 +:1036500001D3FFF7C0FB02F007FE33A9884202D175 +:103660003D9802F00DFE33A8808D00280DD13FB0AB +:10367000F0BD012001F046FC33A8002585853D986A +:1036800002F0FEFD02480575204601F03BFCC046F5 +:103690007C18002086040000181D002080014000D6 +:1036A00003000080001800208C6F0000F0B581B08E +:1036B00000900B09012213405B42194C1C40CD08BD +:1036C00015406D42174E2E404701774067404C0928 +:1036D000144064421448204078408E0916407642D7 +:1036E000124F37404740C80910404042104A02403C +:1036F0007A4098272F40009DED0E49012943C9B219 +:10370000794079251D404D40F32121406940AE2389 +:1037100033404B401E2101405940104601B0F0BDDE +:10372000E2996DB7618EBCF2C4B35F3EA8E2AB2EE6 +:1037300070E4434FF0B581B015460E4607463C781D +:10374000012000210090FFF7B1FF002C12D07F1C58 +:103750001F22224042403C781046FFF7A7FF7F1C03 +:10376000002CF5D106E0FFF7A1FF0246307850406B +:103770006D1E761C002DF6D10824FFF797FF641EFE +:10378000FBD1009A504001B0F0BD000070B5144666 +:103790000A4601460D487844FFF7CCFF2322054630 +:1037A000D54020239E1A0B46B3402B431646203E9D +:1037B0000D46F540002E00DA1D461F232B402370D6 +:1037C000531F641C002A1A46E9D170BDC25A00007A +:1037D000F0B599B01D460346002017901690107062 +:1037E00014296FD11E990020002904D0012969D124 +:1037F0000192082000E001920CAF3870781C14226E +:10380000194601F04AFB15210026324630463B7826 +:1038100000021843134608337F1C491E0224E44368 +:10382000A2420EDB0D3213460A3B0446DC401F2346 +:10383000234002ACA355521F761C092AF3DC521F09 +:1038400000E01A460029E2D1002A019F07D0052195 +:10385000891A88401F21014002A88155761C02A8C0 +:1038600016AA3146FFF792FF0020002E394611D0EC +:1038700002A801780023144A7A44202920D2581C37 +:10388000AB421DD202ACE45C145DFC54B042034672 +:10389000F3D3391800220D4B7B4416AC2478202C2E +:1038A0000ED28418641CAC420AD816ACA45C1C5D11 +:1038B0008C54521C082AF0D300238B54801801E04A +:1038C0000020387019B0F0BDEC590000CC59000050 +:1038D00070B594B014460A46014601A8FCF7ADFB4A +:1038E00001460020002912D001A8027800216B4671 +:1038F0001960011D21250CAE2846334602F026FC36 +:10390000202228463146234602F0CCFB012014B089 +:1039100070BDF0B59DB0144613AAFFF7D9FF00257E +:10392000002811D021266F4613AA012530463946BA +:103930002B4602F0C7FB08373846FEF7C7FB204688 +:103940003946324601F0A9FA28461DB0F0BD000004 +:10395000F0B58BB00746119C012F17D0129E032F94 +:1039600012D1212205AF084611463A46FEF761FF03 +:103970000025684605601421384622463346FFF785 +:1039800027FF002836D136E0022F25D10393049477 +:1039900005A81425457000240470861C21220846C1 +:1039A00011463246FEF745FF022F0DD1109900292E +:1039B00008D06846056000220498334602F06EFA8B +:1039C000002817D1002516E06846039912C005A803 +:1039D00016219623049D09E025460024684614C05C +:1039E0000648301883B22122084611462A46FEF7BF +:1039F0004FFF2C54012528460BB0F0BDFFFF0000FF +:103A000070B59AB00E4604462069002500282AD0D9 +:103A1000217BA068401CFF31C9B211AA00252B46AA +:103A2000FFF777FF00281ED0F388B288A0680078DF +:103A3000716B33256E46B56004AD22C611A9FFF740 +:103A400087FF002500280ED0246904AD284605F024 +:103A5000D3FA421C2846214605F042F901250021EF +:103A6000002800D00D4628461AB070BDF0B585B0CC +:103A70000A4606460020B07334460E34317B0829CE +:103A800027D803AF002101910825384602922A4623 +:103A900001F019FA327BA81A3818B16801F0FDF963 +:103AA000029D2735284605F0A7FAC6B220462946CA +:103AB000324601F0F2F92020A055A019421C0298CC +:103AC000416C3846FEF7C8F930182018019941704A +:103AD000012005B0F0BD000070B598B004466D46F9 +:103AE0006021284605F0E6F8A16928461C304022EE +:103AF00005F0E4FA5C20295C0020002917D1227B24 +:103B0000082A14D8267D082E11D86D46A81A14301C +:103B1000A16805F0D5F8A81B1C302169324605F0D4 +:103B2000CFF804486022294605F0CAF8012018B0F1 +:103B300070BDC0460018002010B50C490860FEF7A3 +:103B400055FA9320C0000A4901240C5401F014FBDB +:103B50002102084805F0AEF8002003F0F1FF2046EE +:103B600003F0EEFFFCF73AFB10BDC046181D002025 +:103B70007C1800201C1D002080B506480078002815 +:103B800001D104F07DFE044979440020024604F08E +:103B9000E3F980BD1C1D00205C5C000080B582B094 +:103BA00001900648784402F0B1F8293001A90122B9 +:103BB00002F00CFAFFF7E0FF02B080BDD869000008 +:103BC00001460020022903D8880002497944085898 +:103BD0007047C046745B000080B5012805D00028FE +:103BE00007D10020FFF7DAFF80BD0120FFF7D6FFE5 +:103BF00080BD002003497944034A7A4404F03AFE28 +:103C000080BDC046130000002700000001460020D0 +:103C1000012903D888000249794408587047C046F2 +:103C2000345B000080B5002802D0FFF7A5FF80BDFF +:103C30000648784402F06AF82921435C00200449D0 +:103C40007944044A7A4404F0F7FD80BD4A690000D3 +:103C50007DFFFFFF91FFFFFF80B5002003497944FE +:103C6000034A7A4404F006FE80BDC046ABFFFFFF66 +:103C7000BFFFFFFF80B5FF2002F0C2FA80BD80B514 +:103C80000120FEF72BF8FFF777FF80BD80B50020FD +:103C9000FEF724F8FFF770FF80BD80B50120FDF727 +:103CA0002BFA002800D080BDFFF766FF80BD80B5ED +:103CB0000020FDF721FA002800D080BDFFF75CFF4F +:103CC00080BD80B50120FDF717FA002800D080BD27 +:103CD000FFF752FF80BD80B50020FDF70DFA0028E8 +:103CE00000D080BDFFF748FF80BD80B50120FDF703 +:103CF00003FA002800D080BDFFF73EFF80BD80B5ED +:103D00000020FCF7F1FDFFF737FF80BD80B50120F3 +:103D1000FCF7EAFDFFF730FF80BD80B50020FCF71F +:103D2000E3FDFFF729FF80BD80B50120FCF7DCFD36 +:103D3000FFF722FF80BD80B50020FCF7D5FDFFF71F +:103D40001BFF80BD80B50120FCF7CEFDFFF714FFFF +:103D500080BD80B50020FCF7C7FDFFF70DFF80BDDB +:103D600080B50020FCF7C0FDFFF706FF80BD80B5E1 +:103D70000120FCF7B9FDFFF7FFFE80BD80B50020F4 +:103D80000146FDF749FCFFF7F7FE80BD80B5012035 +:103D90000021FDF741FCFFF7EFFE80BD80B500205C +:103DA000FCF7A2FDFFF7E8FE80BD80B50120FCF71F +:103DB0009BFDFFF7E1FE80BD80B50178490601D08B +:103DC00001F050FA80BD0000B0B50546072028403C +:103DD0000024012814D0022814D1002909D00B484E +:103DE00002F01AFA68B200280ADA02F0E5F80024B4 +:103DF00006E0FF2152310548002202F025FA044670 +:103E00002046B0BD022001F07DF8C046E01F002032 +:103E1000F0B581B0E04D28780C2810DD0D286CD06D +:103E20000E2800D1C7E015280FD1DC488079012881 +:103E30000BD1A879000708D4102001F063F80528F9 +:103E400000D111E10C2800D181E2D54C0027676038 +:103E500001202070204602F0A3F9042002F01CFA91 +:103E60006060692800D05DE101F0A0F901F0A0F9DF +:103E7000BE25F84E7753042002F00EFA6060002849 +:103E800000D164E2972800D161E2C02430590028B3 +:103E900000D15CE2705BAA27C421715C80B28842C9 +:103EA00000D354E202F0C4F9002800D04FE202F03F +:103EB00041F9B84204D102F067F9B84200D046E2B5 +:103EC0003059715B49014018CC217158002902D04A +:103ED000884700280AD0012803D13059715B490175 +:103EE00040180178490601D001F0BCF9705B401C14 +:103EF000705331590029CFD129E2D54C0027676092 +:103F000001202070204602F04BF9042002F0C4F991 +:103F10006060002800D11AE2972800D117E26928D2 +:103F200000D099E101F042F901F042F9BE25C94EF5 +:103F30007753042002F0B0F96060002800D106E257 +:103F4000972800D103E2C0243059002800D1FEE1B7 +:103F5000705BAA27C421715C80B2884200D3F6E16D +:103F600002F066F9002800D0F1E102F0E3F8B8426F +:103F700004D102F009F9B84200D0E8E13059715B90 +:103F800049014018CC217158002902D088470028E7 +:103F90000AD0012803D13059715B490140180178DA +:103FA000490601D001F05EF9705B401C7053315935 +:103FB0000029CFD1CBE1EA4D00276F6001202870A6 +:103FC000284602F0EDF8042002F066F904466C6021 +:103FD000692C00D0E6E001F0E9F801F0E9F8BE2430 +:103FE000E04E3753042002F057F96860002800D1F2 +:103FF000ADE1972800D1AAE1C0257059002800D171 +:10400000A5E1305BAA27C421715C80B2884200D34D +:104010009DE102F00DF9002800D098E102F08AF845 +:10402000B84204D102F0B0F8B84200D08FE1705924 +:10403000315B49014018CC217158002902D08847D2 +:1040400000280AD0012803D17059315B490140187A +:104050000178490601D001F005F9305B401C30536E +:1040600071590029CFD172E1BD4C00276760012052 +:104070002070204602F094F8042002F00DF96060F0 +:10408000002800D163E1972800D160E1692800D0C1 +:1040900018E101F08BF801F08BF8BE25B14E775393 +:1040A000042002F0F9F86060002800D14FE1972861 +:1040B00000D14CE1C0243059002800D147E1705BA9 +:1040C000AA27C421715C80B2884200D33FE102F08C +:1040D000AFF8002800D03AE102F02CF8B84204D141 +:1040E00002F052F8B84200D031E13059715B490119 +:1040F0004018CC217158002902D0884700280AD0E6 +:10410000012803D13059715B4901401801784906F3 +:1041100001D001F0A7F8705B401C705331590029A1 +:10412000CFD114E1C0258F4C6059002800D106E1A1 +:10413000BE26A05BAA27C421615C80B2884200D35E +:10414000FDE002F075F8002800D0F8E001F0F2FF81 +:10415000B84204D102F018F8B84200D0EFE060593C +:10416000A15B49014018CC216158002902D0884741 +:1041700000280AD0012803D16059A15B49014018E9 +:104180000178490601D001F06DF8A05B401CA053F6 +:1041900061590029CFD1D2E01C1E0020342100201B +:1041A000481F0020D8206F4D2958002911D06422C3 +:1041B00064290B4600D31346CA1A2A50D421002A78 +:1041C00007D16958002904D0DC22AA582A500020BF +:1041D0008847002C00D1BAE0972C00D1B7E0C0246A +:1041E000285900282FD0BE26A85BAA27C421695CC5 +:1041F00080B2884227D202F01BF8002823D101F0B8 +:1042000099FFB84203D101F0BFFFB8421BD1285932 +:10421000A95B49014018CC216958002902D0884780 +:1042200000280AD0012803D12859A95B4901401868 +:104230000178490601D001F015F8A85B401CA8538D +:1042400029590029D2D1C420285CBE21695A7AE0BC +:10425000481F00201C1D0020C025424C605900282A +:104260006DD0BE26A05BAA27C421615C80B28842C3 +:1042700065D201F0DDFF002861D101F05BFFB8429B +:1042800003D101F081FFB84259D16059A15B4901C6 +:104290004018CC216158002902D0884700280AD054 +:1042A000012803D16059A15B4901401801784906F2 +:1042B00001D000F0D7FFA05B401CA053615900293A +:1042C000D2D13CE0D020274C2058002803D0E978F8 +:1042D000490801F00BF8C025605900282FD0BE26F0 +:1042E000A05BAA27C421615C80B2884227D201F07A +:1042F0009FFF002823D101F01DFFB84203D101F038 +:1043000043FFB8421BD16059A15B49014018CC2141 +:104310006158002902D0884700280AD0012803D11B +:104320006059A15B490140180178490601D000F0AD +:1043300099FFA05B401CA05361590029D2D1C42031 +:10434000205CBE21615A814201D301F071FF01F06E +:104350006FFF002801D100F0DDFD012001B0F0BDAC +:10436000481F00201C1D0020B0B582B019481A4D0E +:104370002A18294615316846FEF75DFC00240028FE +:1043800025D1164914316846082204F0A9FC0028FA +:104390001DD100206877F5214A003D21C9006B5CE2 +:1043A0000A21002B05D0AB5C002B02D10121A954BE +:1043B0000021092212030A4BEA52FF225200022373 +:1043C000AB522975074990220A7048700124204693 +:1043D00002B0B0BD7D0400007C1800200018002051 +:1043E00002020000E01F0020F0B583B02A4EB07F2B +:1043F00000280BD0294C204655302B497944072200 +:1044000000F04BFD5C20002121543FE0244832188D +:104410003146153101A8FEF70EFC224F3D680028F9 +:104420000DD04020285C082833D11C4C2046553044 +:104430001E497944062200F030FD5B3424E0273524 +:10444000284604F0D9FD0246144C5534204629462E +:1044500000F023FD3D682735284604F0CDFD2021DE +:104460002154284604F0C8FD2018401C81218900F1 +:10447000705001A8FDF7AAFD05463868273004F002 +:10448000BBFD28182018441C00202070012003B018 +:10449000F0BD0020FBE7C0467C180020001800207B +:1044A0007D040000181D0020895200005B520000AE +:1044B000F0B5A5B01E4614460F460546FEF7EAF8CD +:1044C000002807D0A74979440A22204604F0F8FBC7 +:1044D00025B0F0BD0494A14800684024005D112877 +:1044E00044D128463946FEF734F903909B480068CA +:1044F000005D11283AD128463946FEF7EDF800282C +:1045000012D07B208000039C002C07D09449085CCB +:10451000002803D0083D2846FDF7F4FD002C049840 +:104520007ED0924979447DE08C480068005D112876 +:104530001CD128463946FEF707F9002816D07B2003 +:1045400080000399002907D08549085C002803D022 +:1045500028460838FDF7D6FD2C78FD2C7F4F64D116 +:104560006878A97809020143C81C5FE02846FDF776 +:10457000DDFE002810D079480068406B0028A7D0E5 +:1045800001F0C4FB0146A8786A461060EB1C0022CB +:10459000049801F083FC9BE7704F3868C488284674 +:1045A000FDF73EFE0321002802D0386884880421EC +:1045B000200A04D005AA54701070022702E005A852 +:1045C0000470012705A8C0196918142503902A460C +:1045D00000F063FCFF20EA306149085C002810D03D +:1045E0005E480068C28801200021944200D008463D +:1045F0006946086014210398049A3346FFF7E8F8E7 +:1046000066E7012069460C6048602F43B9B2B3B237 +:1046100005A8049C2246FEF73BF90021215457E7E8 +:104620005149794404F0E0FC52E7601C291815391F +:1046300020AE1422304604F043FB307800281CD012 +:10464000002020A94E4A7A440B781C09145D05AD60 +:104650002C542C180F251D40535D6370491C801C81 +:104660002928F1D3282005AB002119544121454ABE +:104670007A44049801F076F92AE703200121FD2C01 +:1046800000D00846295C4018295C4118039800288E +:104690000CD0685C0818401C295C00290AD04C2901 +:1046A00009D1291849784018801C04E0681840781E +:1046B000891C09E0401C291849784018801C295C95 +:1046C0000818401C295C491C08182A5C411C4C2A0B +:1046D00000D001466C186078A17809020143E078A7 +:1046E000227912020243100408431F901FA8204998 +:1046F0007944042204F0AEFC00280DD01FA81E4906 +:104700007944042204F0A6FC002800D0E0E61B490E +:1047100079440B220498D9E63D68287919AE3070A7 +:1047200021461131701C15273A4604F0C9FAA888B1 +:1047300001216A4603C205AD5023304639462A4658 +:10474000FEF7A6F8002129544420205C6946086041 +:104750004121084A7A4404982B468BE7181D002013 +:104760007C180020C65900008350000070510000E2 +:10477000BF4F0000604F0000CF4F0000885700007F +:104780008E50000075500000F0B597B001AD502478 +:104790002846214604F08EFA4548464F391815A898 +:1047A0000822FEF7B4F8444838187B2189002A46CD +:1047B0002346FFF77DFE414E40223046294604F055 +:1047C0007DFCA1208000385C142811D13C483818A9 +:1047D00040497944042200F07FFB002808D1394881 +:1047E00038183D497944042200F076FB00282FD088 +:1047F000354C374626682736304604F0FDFB024626 +:104800003D4641352846314600F047FB26682736AD +:10481000304604F0F1FB2021295430463E4604F096 +:10482000EBFB2818401C81218900224A505015A812 +:10483000FDF7CCFB05462068273004F0DDFB281887 +:10484000401C3018412100224254012017B0F0BD15 +:104850001E48381801210022FDF732FE034630467B +:1048600041301F2B06D0032B07D0012B0BD11B4946 +:10487000794404E01A49794401E01A49794406224E +:1048800004F01EFA04E01421174A7A4401F06AF891 +:1048900035464135284604F0AFFBC4B228198121C2 +:1048A000890078500A483818FDF790FB2018C8E7AF +:1048B0007A0200007C18002082020000001800200C +:1048C0008502000089020000181D00208D020000F2 +:1048D00091020000244F0000BF5600008B4E0000E4 +:1048E0008B4E00008B4E0000834E000070B58CB0E4 +:1048F00020206946486004AE0E600C4894300C4D90 +:104900002A46413201240023214601F07BFB684600 +:10491000082306601836436086604121054A7A44C0 +:10492000284601F01FF820460CB070BD7C1800200E +:1049300000180020FE4D0000F0B59BB007A85021E4 +:1049400004F0B8F94F4F39680020002959D1009080 +:104950004E4C0120029038604B482118264605AC89 +:104960000825204601912A46FDF7D1FF39460C3132 +:1049700020462A4604F0B4F9002841D144483018B2 +:104980007B21890007AD50232A46FFF791FD394668 +:104990001C31284604F0E4FA0028344630D13D4862 +:1049A000205C022808D14720000121584A1E2250CD +:1049B00002230121002A30D08F20C50063590198BD +:1049C000C118354A1646A25BD21A00F066FA605941 +:1049D000A15B081AA053029E7502605DEF210140A1 +:1049E0006155FBF7C5FF002804D001204002205C80 +:1049F000C006F6D5605DC00605D538680028A8D089 +:104A000000981BB0F0BD472000012158002000296C +:104A100000D006461F48235C3146022B19D10029DD +:104A200017D003201B4960541C4822182146153119 +:104A300003A8FEF700F9002807D1143703A80822BD +:104A4000394604F04DF9002801D00020D9E711487B +:104A5000235C0120032BD4D100206077F520410096 +:104A60003D20C000225C0A20002A05D0625C002A9A +:104A700002D10120605400202075FBF75DFF01206A +:104A8000BFE7C046001800207A0200007C18002012 +:104A9000820200007C0400006E0400007D0400001F +:104AA00010B59320C0000F4C205C002802D0FFF707 +:104AB00043FF10BDFFF768FE4720000120580A4958 +:104AC0006158491C0B1A094855301421084A7A4488 +:104AD00000F048FF074979440020024603F03CFA01 +:104AE000012010BD7C180020740400000018002074 +:104AF0005A4C0000824E000010B59320C0000E4CAE +:104B0000205C002802D0FFF72FFC10BDFFF76CFCE3 +:104B10000146002000290ED07B208000205C002868 +:104B200002D00649794401E0054979440020024653 +:104B300003F012FA012010BD7C1800202C4F000059 +:104B4000124F000080B5FFF7D1FE034979440020E1 +:104B5000024603F001FA80BD4C4D000010B504463A +:104B600004497A22FDF7BAFF00212046FDF720FF15 +:104B700010BDC04600180020B0B504460A4DC83527 +:104B8000284604F039FA20212954291800204870B9 +:104B9000002C02D00649794401E0044979440246D8 +:104BA00003F0DAF9B0BDC046E01F0020E84F000076 +:104BB000CA4F000080B5034979440020024603F043 +:104BC000CBF980BD4050000080B5034979440020F6 +:104BD000024603F0C1F980BD9C50000080B5054934 +:104BE0007A22FDF77BFF044979440020024603F056 +:104BF000B3F980BD001800202451000080B505499C +:104C00007A22FDF76BFF044979440020024603F045 +:104C1000A3F980BD00180020B051000080B5034901 +:104C200079440020024603F097F980BD54520000F9 +:104C300010B58CB06C46204604F078F9A0850D497B +:104C4000084206D1684601F01BFB0A90FF2001F0E4 +:104C5000D7FA01F009FB6946884202D10A9801F0AF +:104C60000FFB6846808D002801D10CB010BD00F00C +:104C700049F9C046FFFF0000F0B59FB00446002C84 +:104C80002FD10DAC002648222046314600F01BF9FA +:104C9000032525720D9633480E902046093034497D +:104CA00079440526324604F00BF820461730314F80 +:104CB0007F443946324604F003F82046273039460F +:104CC000324603F0FDFF26462D362B497944304607 +:104CD0002A4603F0F5FF4020112121541A960420A2 +:104CE0001E9021480460214C01200102204603F05F +:104CF000E1FF01AD284604F019F9A88585B2002D21 +:104D00000BD001A8002181850B9801F0B9FA0B980E +:104D100001F0B6FA102DE7D01FE001AD284601F0F2 +:104D2000AFFA0B9000F028FAFDF760F9002002F0CE +:104D300007FF012002F004FFFEF71EFFFBF74EFA0B +:104D400001F092FAA84202D10B9801F099FA01A859 +:104D5000808D0028C8D000F0D5F8FFF769FF1FB09C +:104D6000F0BDC04678006E00181D00201C1D0020FC +:104D7000934A0000884A0000714A0000F0B59FB0D5 +:104D80000446A068002831D10DAD002748222846EE +:104D9000394600F098F80320009028720D973748A4 +:104DA0000E90284609303749794405273A4603F0E2 +:104DB00087FF28461730344E7E4431463A4603F08A +:104DC0007FFF2846273031463A4603F079FF2E46CA +:104DD0002D362E4979443046009A03F071FF402069 +:104DE000112129541A9604201E90A5600027244EF4 +:104DF00001AD284604F09AF8A885304207D101A8F1 +:104E000001F03EFA0B90F8070FD001F0D5F901F050 +:104E10002BFA01A9884202D10B9801F031FA01A8BE +:104E2000808D002828D10127E2E70A2001F0B8F898 +:104E30006068022817D004280BD00328E5D1E06869 +:104E400000218161A168E068FEF7DAFDE168886110 +:104E5000DBE7E0680021C162A168E068FEF706FEBA +:104E6000E168C862D1E7E068FEF736FE0028CCD0E2 +:104E7000A068FEF761FEC8E700F044F878006E0015 +:104E8000FFFF00008B4900008049000069490000D5 +:104E900080B5002001F0F4F980BDB0B5884208D992 +:104EA000002A0FD0491E401E8B5C8354521EFBD13A +:104EB00008E0002A06D000239CB20D5D05555B1C5E +:104EC000521EF9D1B0BD80B50B46002A03D0114661 +:104ED0001A4603F0FDFE80BDB0B50023002A0FD0B6 +:104EE000401E491E8C5C855C521EA54202D1002AE0 +:104EF000F8D105E00020C0430123A54200D80346B5 +:104F0000D8B2B0BD10B5044601F0AEF9214604F0A8 +:104F100019F8000080B501F08BF9002800D080BDA1 +:104F20000648002141706022027002228270C17026 +:104F30000171052101F070F980BDC0461C1E0020E2 +:104F4000B0B51A48C078032807DC01280DD0022824 +:104F500028D1174802F073F9B0BD04281FD00828E3 +:104F600020D1134802F069F9B0BD114C012120464F +:104F700002F05EF9204602F03DF90E4CA0790028BF +:104F800011D120460C30002504222946FFF79BFF53 +:104F90001034082220462946FFF795FFB0BD04488B +:104FA00002F049F9B0BD1020FFF7ACFF1C1E002035 +:104FB000F4210020342100207F210140002003291A +:104FC00003D8C8B201490818007B7047342100207B +:104FD00080B516480179042918D0022906D0012984 +:104FE00022D1811D134802F00DF880BDC2787F21C7 +:104FF0001140032918D8C9B24A000D4B9A18002352 +:105000001382821D0B4802F082F880BDC2787F2196 +:105010001140032908D8C9B2054A521843791373BD +:10502000821D044802F01CF880BDC0461C1E0020F2 +:1050300034210020F421002070B515460E460446A8 +:10504000FF2D1BD80E4850210170202101714571A0 +:10505000E91C817080222243C270090A4170062136 +:1050600001F0DAF83046294601F0D6F87F202040DA +:105070004000044908187D210901018270BDC04625 +:105080001C1E00203421002080B50A4601468220E3 +:105090001423FFF7D1FF80BD80B50A460146832067 +:1050A0001423FFF7C9FF80BD80B50C4801780029A3 +:1050B00000D080BD062181710A21017008498B78DA +:1050C0004A7812021A43FF232A339A4200D31A461F +:1050D0004280C91C0348FFF7E0FE80BD3421002058 +:1050E0001C1E0020E01F0020B0B5204882784178C7 +:1050F0000902114300780F280ADC0E2810D00F286F +:1051000023D10020012927D1FFF71AFF0120B0BDCC +:1051100010281ED0162818D1FFF7C6FF0120B0BDF9 +:1051200013488168643181601621124A435A002B6A +:1051300008D06424642B1D4600D325465B1B4352D4 +:1051400013420ED0891E0E29F0D10220FEF760FE18 +:10515000B0BD0020032900D2B0BDFFF739FF012008 +:10516000B0BD002101701020FFF7CCFE1C1E0020F6 +:1051700034210020FFFF0000B0B50A2000F010FF2E +:10518000084C0025182220462946FFF79CFE658022 +:105190002570A571A56000F061FB034805604560BE +:1051A000B0BDC046342100204C21002070470000D3 +:1051B00002480021016041607047C0464C21002038 +:1051C000F0B589B00546084600F0A0FD0446002C65 +:1051D00043D02069002840D0284600F097FD0146C2 +:1051E00002AD1C2228460192FFF757FE2168E98094 +:1051F00062682A81A0681A4F65233B7089B292B217 +:105200004A434243D1084E1C07231A4200D10E469E +:10521000314600910426864070181D30B870000A8F +:1052200078700321384600F0F7FF2846019900F016 +:10523000F3FFA06838700121384600F0EDFFE06808 +:1052400000F064FDB1B200F0E7FF009885B220697C +:1052500000F05CFD294600F0DFFF09B0F0BDC0465C +:105260001C1E002070B500F051FD044620787F26FA +:10527000064000F0DDFF002830D1002E2ED0E0697E +:1052800000281DD000F042FD0546052E02D1A07E6B +:10529000002824D0284603F0AFFE064612486521B8 +:1052A000017031461C318170090A4170032100F000 +:1052B000B3FF1C21204600F0AFFFB1B228460BE03F +:1052C000094800214170652101701C25857003216A +:1052D00000F0A2FF2046294600F09EFF70BD204648 +:1052E0002946FFF76DFF70BD1C1E002070B50446F7 +:1052F000002C28D01448066845688E4201D16D1CE8 +:1053000045600E43002902D00660324605E00022C7 +:10531000026042600D4B5B1C1E438A4201D000219B +:105320004160082D0CD30321284603F0D3FB012252 +:1053300090073043002900D03046D107884300E071 +:1053400030462946A04770BD4C210020FFFFFF7F5B +:10535000F0B581B00F4E01243470B11CFF275037D7 +:105360007A1C204600F03EFF054675707A1B7719BF +:10537000F91C022000F036FFB8702D187619F47071 +:1053800000F024FF3071902070710020B071E81D92 +:1053900001B0F0BDE01F0020F0B58BB00A46064614 +:1053A00007210E4207D03346D8B291B2FEF70CFD6A +:1053B00080B20BB0F0BD4B20840083200390AA4D37 +:1053C000A84F3346019109E06920A9490870039864 +:1053D000801C487002220199079B2DE11021304664 +:1053E0000840049292B20592002A069600D1B5E0D8 +:1053F000002800D0B2E007930091029007E0A1B22C +:105400000022384600F020FF012000F03FF900F0B4 +:105410000FFF0028F3D17D200001A9680E1828781D +:105420000928079A42DC072848D0092863D10021BF +:105430008E48079101F0F8FB10E0FFF76BFDA1B279 +:105440000022384600F000FFA868B04200D3FEE01A +:10545000FFF74AFE00F0ECFE0028F0D1834801F08F +:1054600039F90028E9D0059AD01D4008A92800D3B1 +:10547000F3E003980D307E4B9854981807994170CB +:10548000581D0499891C8AB205921946FFF705FD3B +:10549000052277480799FFF716FD0598401D83B24E +:1054A00072480399724A01F0D3FB3FE00A2804993D +:1054B0000AD00B2822D17148784401E06E48784424 +:1054C000059900F035FA31E02046253080B2059E7E +:1054D000864200D9C1E053203870B970080A78704C +:1054E0000321384600F098FE6148314600F094FEF2 +:1054F000002028701DE0002800D1ABE0D0B2059953 +:10550000FEF762FC002811D0A4E0FFF703FDA1B272 +:105510000022384600F098FEA868B04200D396E01A +:10552000FFF7E2FD00F084FE0028F0D12878002883 +:10553000EBD10020A87128706880069EB10600D5C6 +:1055400036E7FFF7E7FC30060298009906D5089188 +:1055500008AA484B1846114601DF0298002804D1DA +:1055600070066ED40020A87128700020688000F0BA +:105570005FFE002801D1FFF7CDFCA1B20022384622 +:10558000079200F061FE022806D8B9787A781202F4 +:105590000A43D11C81423DD1FFF7A6FD68882978D6 +:1055A0000029E4D00028E2D0354979440422304E65 +:1055B0003046FFF791FC00282ED03249794404226E +:1055C0003046FFF789FC00282BD02F49794404226C +:1055D0003046FFF781FC002837D103982730C6B248 +:1055E00000F0D2FDB04200D0EEE60120204E307037 +:1055F000B01C402100F0BAFD7070811C184A121DC9 +:105600001140039B0D337354C11C1140002373548C +:10561000021D10E00020A7E7FFF79AFE02460023D4 +:1056200009E00020707003980D30307080200699DA +:10563000014302220B460199DEB20B4200D1CDE6B6 +:10564000B2E6688806494018B2E66888B0E61020DD +:10565000FFF758FC0920FFF755FC0220FFF752FC2A +:10566000FBFF00001C1E00203421002054210020DC +:10567000E01F0020BE9A0060C7FBFFFFDDFBFFFFBD +:10568000FE480000F1480000E648000070B50446FE +:1056900000F0CEFD002801D1FFF73CFC4B2081003B +:1056A0000B4E002530462A4600F0CEFD30781528F6 +:1056B00006D8012181400748014201D0002C05D1C4 +:1056C000FFF712FD0125002800D10546284670BDD0 +:1056D0001C1E00202070200010B5FFF71BFC084C9A +:1056E0004B2081000022204600F0AEFD20780E28DD +:1056F00001D0FFF7F9FC00F09BFD0028F0D110BDB0 +:105700001C1E0020F0B581B000920F4604464B4E9F +:10571000B74210D0494D0021402628463246FFF7B7 +:10572000D2FB00984028024600D33246284639462C +:10573000FFF7B3FB414EB07801280ADC002828D0DF +:10574000012869D1F01C042100F04EFC40213046B4 +:105750002BE0022827D005285ED13079F1780902A4 +:105760000143374C2068002781425BD12068002824 +:105770001ED03448009D2918334A13686D1FADB2FE +:10578000AB4200D21168051D0D4030480068711D04 +:1057900034E0F01C002704223946FFF794FB402137 +:1057A0003046A0473EE025484021A047002739E089 +:1057B000B0797179090201432548016001684908FF +:1057C000A8292FD801682048016071783278120228 +:1057D0000A4320490A601D491F4A0A60009D691F4B +:1057E0008AB218495218D21C0368ED1FADB2AB4201 +:1057F00000D202680D1D1540F11D17482A46FFF71B +:105800004CFB11480168491B0160104801684919A7 +:1058100001602068401C20600B48016801200227BD +:10582000002907D1064800210160084801600648A8 +:1058300001603846C0B201B0F0BDC04698210020DA +:10584000D8210020FBFF0000E0210020E4210020FF +:10585000DC210020E8210020E01F00200348002177 +:10586000016003480160034801607047D8210020AF +:10587000E4210020E0210020F0B581B0264F3A68F5 +:10588000264C2168002921D0002A1FD00090264DE7 +:10589000002140222846FFF716FB0520A870234868 +:1058A0000168090A2970006868701D490868000AC3 +:1058B000E870086828710968206800290ED03B2626 +:1058C0003B2800D826683968681D12E0144800217A +:1058D000016039601348017021601BE039263928C6 +:1058E00000D826682068000A68712068A8713968A5 +:1058F000E81D3246FFF7D1FA009A09492068801B5B +:1059000020603868801938600868401C08600648C4 +:105910004021904701B0F0BDE4210020E0210020AB +:10592000D82100203421002098210020E8210020E7 +:1059300080B500290BD0064A00231360054A116088 +:10594000054A064B1360064A1160FFF795FF80BDBC +:10595000D8210020E0210020E4210020E01F0020C9 +:10596000DC21002081B0F0B58EB015460C460690C3 +:105970001393022C00D2BAE10698002800D1B6E1B8 +:10598000002D00D1B3E10698214603F093F913A846 +:1059900009902978002900D1A9E1671E002602E0BC +:1059A000A8194178761CC8B2002801D02528F7D163 +:1059B000BE4200D33E46069C20462946324603F0AE +:1059C00083F9BF1BA4190694002F00D18FE1A95DB4 +:1059D000AD19252900D087E16B1C002020210A2267 +:1059E00008920490059007900446084604E009993F +:1059F0000A1D0992096804911D46224629786D1CEA +:105A000000242D29F9D0472918DC2F2926DD0B4643 +:105A1000303B0A2B00D366E13029044600D10C4606 +:105A2000079B002B00D004460A23079843435818CD +:105A3000303807902B4620461446DDE7672904DD01 +:105A4000722921DD73293AD122E062293CDC482900 +:105A50004BD1014601200590084617E0252958D072 +:105A60002A2926D02E2900D03DE129782A2900D0E4 +:105A70003AE16A786B1C01242A21482AB7D0682AA7 +:105A8000B5D0732AB3D02FE1682936D110210891FF +:105A900009990B1D0993032313400968012B00D1B9 +:105AA000BBE0022B00D1BAE0032B2B461446A3D057 +:105AB000C6E02978022473292B4698D014E1752971 +:105AC00029D078291CD00EE1632900D19BE06429FC +:105AD00000D008E1029003970998011D0991006820 +:105AE000C11742184A40C00F1CE0582900D0FAE004 +:105AF000014601200590084602E0702900D0F2E03E +:105B0000029003970998011D09910268002010274F +:105B100009E025207BE0029003970998011D099177 +:105B2000026800200A27012497420892049012D8A4 +:105B3000012638460446394602F046FFB04209D1F4 +:105B4000384660430799491E0791089988422646BE +:105B5000F0D900E034460798411E049B002B00D189 +:105B600007990026F243002B029800D11A460192B1 +:105B7000C2B2302A06D1002B04D00AA82D2303700C +:105B800000230126881E0D280BD80AA83043491E81 +:105B9000049303F09DF8049B07988019019940181D +:105BA000461E002B03D00AA82D218155761C05988E +:105BB000002C1AD0002802D05348784401E0514804 +:105BC000784407900898214602F0FEFE394602F01C +:105BD00081FF0798405C0AA988552046394602F0A3 +:105BE000F3FE761CA7420446ECD9039FBE4200D3C5 +:105BF0003E460AA9069C2046324603F065F8BF1BC4 +:105C0000A41906946DE00998011D09910068069990 +:105C100008707F1E491C069163E0049E16E0087818 +:105C2000002860D10499B94200D339462022069C4D +:105C30002046049103F04CF804983F1A24183DE0E4 +:105C400000228B5C521C002BFBD1561E089810289A +:105C50002AD1002E47D000243B46085D0F22024087 +:105C60000009022B1F4642D3059B002B05D0012BB8 +:105C70000ED10794224B7B4402E007941F4B7B44D8 +:105C8000D2B29A5C069C6270C0B2185C2070079C0D +:105C90003846871E02282AD0641C0698801C06906D +:105CA000B4423B46D9D30DE0BE4200D33E46069CEB +:105CB0002046324603F008F8BF1BA4190694002FB3 +:105CC000079C14D0B4420ED9A41BBC4200D33C465E +:105CD0002022069E3046214602F0FAFF3F1B36196D +:105CE0000696002F03D02978002900D056E6002020 +:105CF0000EB0F0BC02BC01B00847C04639420000FB +:105D000051420000F74200000D43000080B50449F5 +:105D1000884204D30349884201D200F005F880BDCF +:105D20000000D0C0C0A5D0C07A460249C91C891A5B +:105D3000401A7047295DD0C010B54101104A0A4091 +:105D4000430E01210B405B420E4C1C405440820E1E +:105D50000A4052420C4B13406340C20E0A4052426A +:105D60000A4C14405C40020F0A405242084B134058 +:105D70006340400F0840414206480840584010BD6B +:105D8000E0FFFF3FB2576A3B6D8E5026FA19A11E05 +:105D9000DD33423DB362142AF0B587B00593049217 +:105DA000064602910D7800270120002D03971BD095 +:105DB0000298401C0690012000272C46019721469E +:105DC0004139E2B2202A5FD3C9B21A295CD3FFF766 +:105DD000B3FF01460698C25DE020044060094840D8 +:105DE0007F1C002A1446EAD10599C919C91D5A29F0 +:105DF00003994CD8FFF7A0FF002D0ED002994C1C40 +:105E0000FFF79AFF014635701F2028404840611C6B +:105E1000761C2578002D0C46F2D131213170711C91 +:105E200006910599002914D000241A4E7E4403944B +:105E300004990F5D1F2F29D8F55DFFF77DFF0699A7 +:105E40000D557840641C05998C42F1D306990919C7 +:105E500006910624FFF770FF641EFBD10121484024 +:105E600019220D497944069B0446D4401F2525403C +:105E70004C5D1C70541F5B1C002A2246F4D100208C +:105E800006998871012102E0019900E00399084612 +:105E900007B0F0BD3834000000340000F0B595B014 +:105EA0000C46054600200390102A1EDC1A99002A91 +:105EB00003D08E1E262E04D917E0142901D02029E4 +:105EC00013D104AE327001206A46082782C21060E6 +:105ED000701C03A9052200F00AF80398431C0393E1 +:105EE000284621463246FFF757FF15B0F0BDF0B502 +:105EF00087B00493019105461046012383405C1E40 +:105F000000270E9900910D9902910C9A002A3E46A5 +:105F100027D04142059100263746029976188F40D6 +:105F200004990B781F43491C0491521E0392864228 +:105F3000069712DB01990B68024620465C1C0C6038 +:105F4000059CA4192F46069DE540044610462540B1 +:105F5000FD543D46361A8642EDDA039A002A069F22 +:105F6000DBD1009900290CD0002E13D001990B68C9 +:105F7000024620465C1C0C60911B8F400740EF548A +:105F800008E0811B8F40274000210298864202DAF8 +:105F9000002F00D10121084607B0F0BD01DF704796 +:105FA00080B584B00190034801A9FFF7F7FF04B062 +:105FB00080BDC0463701006080B582B002486946A6 +:105FC000FFF7ECFF02B080BD3C02006080B586B0F8 +:105FD000019002910392034801A9FFF7DFFF06B089 +:105FE00080BDC0467F03006080B584B00090019101 +:105FF00003486946FFF7D2FF019804B080BDC04650 +:106000002C05006080B588B0009001910292039346 +:106010000A9804900B98059003486946FFF7BEFF65 +:10602000019808B080BDC0463B07006080B584B0D1 +:106030000190034801A9FFF7B1FF029804B080BDA9 +:106040007F08006080B584B00190034801A9FFF784 +:10605000A5FF029804B080BDDB0A006080B586B061 +:10606000009001910292039303486946FFF796FF5F +:10607000019806B080BDC0462C0B006080B588B08A +:1060800000900191029203930A9804900B98059056 +:1060900003486946FFF782FF019808B080BDC046FB +:1060A0002B1A006080B586B0009001910292039394 +:1060B00003486946FFF772FF019806B080BDC046ED +:1060C000EA2E006080B586B00090019102920393A1 +:1060D00003486946FFF762FF019806B080BDC046DD +:1060E0002E2F006080B58AB0009001910292039338 +:1060F0000C9804900D9805900E9806900F980790B4 +:1061000003486946FFF74AFF01980AB080BDC046C0 +:10611000F338006080B586B0019002910392044884 +:1061200001A9FFF73BFF029880B206B080BDC046D0 +:106130006E92006080B582B003486946FFF72EFF7B +:106140000198C0B202B080BD4F9F006080B588B09A +:1061500001900291039204930A980590024801A9C4 +:10616000FFF71CFF08B080BDBA53006080B584B053 +:106170000090019103486946FFF710FF019804B0B1 +:1061800080BDC046FCA8006080B582B00348694667 +:10619000FFF704FF0198C0B202B080BD3CA00060D0 +:1061A00080B584B00190034801A9FFF7F7FE02987B +:1061B00004B080BD5864006080B582B00248694672 +:1061C000FFF7ECFE02B080BD8D68006080B582B044 +:1061D00003486946FFF7E2FE019802B080BDC04661 +:1061E0006E6A006080B586B0019002910392034808 +:1061F00001A9FFF7D3FE029806B080BDD4740060F9 +:1062000080B584B00190034801A9FFF7C7FE04B030 +:1062100080BDC046BE9A006080B584B000900191F8 +:1062200002486946FFF7BAFE04B080BD8183006072 +:1062300080B582B003486946FFF7B0FE019802B00E +:1062400080BDC046BB84006080B586B001900291DD +:106250000392044801A9FFF7A1FE029880B206B09C +:1062600080BDC046E485006080B582B003486946C1 +:10627000FFF794FE019802B080BDC046B187006070 +:1062800080B584B00190034801A9FFF787FE02980A +:1062900004B080BD7588006080B584B0019004486A +:1062A00001A9FFF77BFE0298C0B204B080BDC046D2 +:1062B0008B9C0060F0B585B03A4A1278002A03D072 +:1062C00083213A4A7A440BE00A9A452A03D883216B +:1062D000374A7A4404E0072907D18321354A7A44B2 +:1062E000022300F0B5FC05B0F0BD01920290402001 +:1062F0000393185C0490002822D004980528039D7D +:1063000008D1284641302C4979440522FEF7E4FDA6 +:10631000002833D041350027284E7E44049C0321B9 +:10632000384602F051FB0221C9434143705C297891 +:1063300041402970641E761C6D1C7F1C002CEED120 +:1063400045200399085C4630019A904210D14131B2 +:106350001548049C2246FEF7A0FD072011498871CC +:106360004C80092008700121029800F05DFCBAE71A +:106370008321134A7A4402230298B2E70A4D03228A +:106380002A70681C0F497944FEF787FD281D0E49C5 +:1063900079440422FEF781FD2878431D8321029869 +:1063A0002A469EE734210020E01F0020153C000013 +:1063B000093C0000FF3B0000D73B0000CB3B000046 +:1063C0007A3B00005F3B0000593B0000F0B581B014 +:1063D0001D460E460446284600F016FC00280ED046 +:1063E0002068C11C090A6A469170811C090C517011 +:1063F000411C090E1170001D2060D07004E0684639 +:1064000004222946FEF749FD174F08223846314637 +:10641000FEF743FD3846083069460422FEF73DFD8D +:1064200000207873022139730121B973F87338742D +:10643000284600F0E9FB0146201D8625002906D0EC +:1064400029467931C9B20422FEF73DFD03E06946D1 +:106450000422FEF722FD044A11232046294600F0BB +:10646000F7FB01B0F0BDC046E01F0020F0B583B0DF +:10647000029088794B791F020743887801904B7806 +:106480000E781546093DACB2A74204D0D01FD21FEA +:1064900092B297421BD13D46002E08D083211C4A60 +:1064A0007A440223029800F0D3FB03B0F0BD022B24 +:1064B00018DC012B23D0022B1DD1A8B26A46106034 +:1064C000CB1D002202980199FFF7F4FEEDE7E4B23C +:1064D000A742E1D0D2B297420546DDD083210D4AD2 +:1064E0007A44DEE7032B0ED0C12B04D183210A4A64 +:1064F0007A440423D6E783210A4A7A44D1E78321E8 +:10650000064A7A44CDE78321054A7A440823C9E73D +:106510005C3A0000FB390000083A0000D539000061 +:10652000E6390000043A000080B5C1698A784B78EA +:106530001B0213430A78812A09D0832A0CD0862AA9 +:106540000ED1C91C031D0022FFF740FF80BDCA1CED +:10655000812100F07DFB80BDC91C1A46FFF786FF34 +:1065600080BD000070B50D460146012A11D1094CCD +:1065700020462A46FEF791FC60194026721B002532 +:106580002946FEF7A0FC8120214632462B46FEF725 +:1065900053FD70BD982100200282C1600022C2829A +:1065A000827642858284C16102627047F0B583B011 +:1065B0000D4604462A20215C20462A3001294AD073 +:1065C00000293BD12B210022625423462B33202764 +:1065D000E15DC91EC9B22646203601293ED8218B6D +:1065E000E28A91423CD94020012D00D038460290E9 +:1065F000A07E03230126002800D033460027012D6A +:106600003E4600D12E46B60033431E46029B9B1BDE +:10661000891A1A46914200DC0A4691190291012D0D +:1066200008D1211D2A48042701923A46FEF735FC7D +:10663000019AA07E002820D0FF302BE02521615C4C +:10664000062908D12B21625C0023635423462B3397 +:10665000002A03D1BBE72B200021215403B0F0BD59 +:10666000FCD10021A176E18219700170B180316006 +:10667000E068E06115480170F0E74020205CB9B2A5 +:10668000134B58540120384381B2637E104F7B5422 +:10669000471C207EB9B20E4B5854E169002907D03F +:1066A0001746BAB29819E38AC918FEF7F6FB3A46BC +:1066B000E08A1018E082A07E401CA076029881B289 +:1066C00003482A46FFF74EFFC8E7C04634210020A2 +:1066D0009821002001462A200A5C0120002A10D0BF +:1066E000012A01D100200CE025200A5C0020062AA6 +:1066F00007D12B200A5C01200021002A01D0084686 +:1067000070477047B0B52B2101244454011D0B4D37 +:1067100004222846FEF7C1FB0020687183202871FF +:106720000220A8716920E8717C20C043801C287277 +:10673000092128462246FFF715FFB0BD9821002009 +:10674000B0B52B2101244454011D084D04222846D4 +:10675000FEF7A3FB0020687188212971A871072129 +:1067600028462246FFF7FEFEB0BDC0469821002015 +:10677000F0B581B004462520205C2646253600254C +:1067800005286AD008784B781B0203438878CD78B7 +:106790002D02054328041843237965792D021D43F2 +:1067A000A379E7793F021F433B042B43834257D130 +:1067B00008790B1D658C002D13D02423E75C23463C +:1067C0002433B8424CD1278B401C18707B1B501FC0 +:1067D000984200DB18464219628482B2208D491D1E +:1067E00023E07C25ED436D1DEFB28325B84204D133 +:1067F0002046FFF7A5FF01252FE08F79497909028F +:106800003943C91CA8422BD1208B8DB2A84227D175 +:1068100089B2164D24270020E055121F8A4200DB62 +:106820000A466284154019462A46FFF773FC208504 +:10683000218B628C01258A420FD3E18C88420FD1D3 +:1068400006203070002060842A20205C012804D1BA +:106850002046FFF757FF00203070284601B0F0BDFA +:10686000052030701020FEF74DFBC046FFFF0000F2 +:10687000F0B589B0044623722020205C26462036DD +:1068800003280AD02A25675D25462A35002F1BD00C +:106890002046FFF76DFF002814D1D748062101726A +:1068A000042131707A21C9433A314022A154083081 +:1068B000E0610020A076E08201202083217A20463A +:1068C000FFF774FE09B0F0BD042809D12B20002782 +:1068D0002754A776E7822F70B7803760E068E061C1 +:1068E00008910020012B00D118468700012039466D +:1068F0000143079191423BD80390012B06930492E8 +:10690000059707D1201D04220899FEF7C6FA059FB6 +:10691000049A069BE08A00280CD0012B24D1204643 +:106920001230211D0422FEF7D7FA059F049A069B18 +:10693000002819D0032138460843904218D8009106 +:106940000899C8190290C8570F467A21C9437A316D +:1069500049B28525884225DDA7480421017231709E +:106960003A3540216554A2E702203843904202D9CB +:10697000A148852193E72120205C984246D13078B8 +:10698000012851D1012B7FD1211D042208980392A7 +:10699000FEF7A2FA059F002876D0974806210172DB +:1069A00003997EE70195012B14D1307801281ED17F +:1069B000251D2146123104222846FEF78DFA069B3A +:1069C000002807D0029800780199491CC9B2884272 +:1069D00000D0E8E03078012809D1012B00D080E018 +:1069E000029800780199491CC9B2884279D1079967 +:1069F00078184078795C0F020743208AC01E8742CE +:106A00001FDD7D480099017204216DE07A20C043AA +:106A100001460831784A1172042131703A30402120 +:106A200060540832E26144E7012B56D12B2000214B +:106A30002154A176E1822970B1803160E068E06183 +:106A400040E702980078812805D08628019D51D022 +:106A5000832800D097E0012B57D1251D6749794441 +:106A6000042228460892FEF737FA002807D0644926 +:106A7000794404222846FEF72FFA002845D15E48C3 +:106A80000B21017208992FE0089AD119D05DA27EDE +:106A9000904222D10498079A851AE08A228B121A12 +:106AA000954200DB1546AFB2E2691018491C3A4620 +:106AB000FEF7F3F90699012908D1E08AE16909187E +:106AC000E08C3A46FFF726FB0699E084E08A281816 +:106AD000E082A07E401CA0763CE047480421017281 +:106AE000DFE64548042101723170019A3A324021B3 +:106AF0006254DCE6012B6AD1201D42497944042509 +:106B00002A46FEF7E9F9002870D004980599451A3D +:106B1000FF1CBD4200DB3D46AAB2E0690299089223 +:106B2000FEF7BBF9069B012B06D1E1690020089A0C +:106B3000FFF7F0FA069BE084212023542783E582A7 +:106B40000020A07620461230211D04221D46FEF7AB +:106B5000A4F92946E08A012901D1218B06E0218B85 +:106B6000CA1C824202D22448032198E6884204D2F9 +:106B70000020606301203070A4E6022030702046BF +:106B8000FFF7D2FC9EE61C48039B03720421317080 +:106B9000019A3A32402162540830E0610020A07628 +:106BA000E08223838AE6144C042220462946FEF71D +:106BB00074F90020607101983A302071039AA27133 +:106BC0000620E07108212046FFF7CCFC7AE60A484F +:106BD000039A0272042131703A354021655408301D +:106BE000E0610020A076E082228367E602480B2164 +:106BF0000172357079E7C04698210020A234000068 +:106C0000943400000834000080B506497944042219 +:106C1000FEF762F9014601200022002900D010464B +:106C200080BDC046F432000080B52A22835C024653 +:106C30002A32002906D0002B08D101211170FFF75C +:106C400061FD80BD012B01D10220107080BD0000CC +:106C500070B504462A20205C002809D0012824D0E1 +:106C60002520205C062820D12B20205C00281CD168 +:106C7000202003252554402021540020A076E261E5 +:106C8000E08223832120215C2546213503290DD173 +:106C9000084E3078002808D0032100E029782046EB +:106CA000FFF784FC30780028F8D170BD2046FFF74C +:106CB0007DFC70BD3421002002490020086002499B +:106CC00008607047F0210020EC21002010B5074833 +:106CD000002444704F210170012181700221C17094 +:106CE0000421FFF799FA204610BDC0461C1E002063 +:106CF00070B582B06D4600246C704F262E70022055 +:106D0000A8700320E8702C7105212846FFF784FA4B +:106D10006C702E700120A870E87004212846FFF7DF +:106D20007BFA204602B070BD10B582B001A80024E5 +:106D300044704F210170012181700221C170042132 +:106D4000FFF76AFA204602B010BD0000B0B582B06D +:106D5000144800240460144804606D464F202870D5 +:106D60006C700520A8700420E870012028716971FA +:106D7000AC71012A05DC002A0AD0012A0AD10420BC +:106D800006E0022A03D0032A04D1022000E00320F7 +:106D9000694688716846C3710821FFF73DFA0020F3 +:106DA00002B0B0BDF0210020EC21002010B582B06F +:106DB0006846002444704F2202700522827004222B +:106DC000C2700122027141718471C4710821FFF700 +:106DD00023FA204602B010BDB0B582B00D46684619 +:106DE000002444705021017003218170C57040213E +:106DF000017144710621FFF70FFA8020054201D08E +:106E0000074800E0054801687F2215400122AA409A +:106E10000A430260204602B0B0BDC046F021002007 +:106E2000EC21002070B582B00D4668460024447005 +:106E30005021017003218170C57080260671447154 +:106E40000621FFF7E9F9354201D0074800E005487F +:106E500001687F2215400122AA409143016020462B +:106E600002B070BDF0210020EC2100208020014202 +:106E700001D0064800E0044802787F20014001204C +:106E8000884010407047C046F0210020EC210020CF +:106E900010B582B06846002444704F22027002226E +:106EA00082700322C27001710521FFF7B5F92046F7 +:106EB00002B010BDB0B582B01C46154668465022DF +:106EC0000270C170202101714471E11C8170090AB6 +:106ED00041700621FFF7A0F928462146FFF79CF9EB +:106EE000002002B0B0BD10B582B0684600244470E6 +:106EF0005023037003238370C170302101714271EC +:106F00000621FFF789F9204602B010BD70B515467D +:106F10000E4604460220002C0FD0D421204601F05A +:106F2000C9FE002E01D0B02026509C200121215402 +:106F300025702046FFF7C0FE0020C0B270BDB0B57E +:106F400004469C2001212154B4256059002806D014 +:106F50004068FEF7DBFE024621792046904708355F +:106F6000CC2DF2D12046FFF7DFFE2046FFF7AEFE24 +:106F70000020B0BD0223002A07D00023022804D835 +:106F8000C0000818B42142500023D8B2704780B521 +:106F9000FFF7AEFE002080BDF0B581B00C4605467F +:106FA0000026B4272846314600F066F9002807D0AD +:106FB000E8590068FEF7AAFE024628462146904797 +:106FC0000837761C032EEDD1002001B0F0BDF0B5DE +:106FD00081B00C4605460026B4272846314600F00D +:106FE0004BF9002807D0E8594068FEF78FFE0246AB +:106FF0002846214690470837761C032EEDD1002005 +:1070000001B0F0BDB0B504462546A835284600F0CD +:1070100077FB942001212150AE20205A9821605006 +:10702000A820215C1F200840022808D001280BD08E +:1070300000280ED12046294600F02BF90EE020460C +:10704000294600F0D8FA09E02046294600F0AFFAB8 +:1070500004E0802001402046FFF7BEFE0020B0BDC6 +:10706000F0B583B002920446019100291CD0254658 +:107070009C350027B4262046394600F0FDF800284C +:107080000DD0A0598069002809D02978032906D19C +:10709000FEF73CFE034620460199029A98470836BF +:1070A0007F1C032FE7D12FE09420205803282BD1F9 +:1070B000E16D206E81420AD9091AE165814200D34F +:1070C00001468AB22046029900F0C7FD1CE0264620 +:1070D0009C360025B4272046294600F0CDF800282C +:1070E0000BD0E0590069002807D03178032904D17A +:1070F000FEF70CFE01462046884708376D1C032D1D +:10710000E9D1204600F0B0FD002003B0F0BDF0B59D +:1071100081B00446009100291BD027469C370026E9 +:10712000B4252046314600F0A7F800280CD060595D +:107130004069002808D03978032905D1FEF7E6FD1B +:1071400002462046009990470835761C032EE8D168 +:107150004DE094202058022842D1E069266AB042CE +:107160000AD9D022A1588919A150801BE06182B2AE +:10717000204600F064FD33E0A5692846314601F061 +:10718000A9FCB5420FD300290DD1982020582646DE +:107190009836854207D20025204629462A4600F027 +:1071A0004EFD35601CE026469C360025B42720465F +:1071B000294600F061F800280BD0E059C06800288B +:1071C00007D03178032904D1FEF7A0FD01462046FF +:1071D000884708376D1C032DE9D1204600F050FD8B +:1071E000A020205CA034012801D1002020700020C4 +:1071F00001B0F0BD70B504469C200121215440200F +:10720000206220660025B4262046294600F034F886 +:10721000002807D0A0594068FEF778FD0246217982 +:107220002046904708366D1C032DEDD1002070BD1F +:10723000017400207047002070470020704770B52F +:1072400004469C20205C032814D10025B426204647 +:10725000294600F011F8002808D0A059C06900287C +:1072600004D0FEF753FD01462046884708366D1CC2 +:10727000032DECD1002070BD02460020022907D862 +:10728000C8001018B42141580120002900D1084637 +:10729000704780B54A78042A08DD072A0FDC052AE2 +:1072A00014D0062A1BD100F021F81DE0002A10D0CE +:1072B000012A17D0032A12D100F034F914E0082A69 +:1072C0000AD0092A0BD100F0BDF80DE000F094F8C7 +:1072D0000AE000F005F907E000F0EBF804E000F048 +:1072E000E3FB01E000F03BF9002080BDB0B582B0C7 +:1072F0000D46044601A8002101806A88100A05286D +:1073000012DC01281CD0022824D0032837D1D0B2A7 +:10731000022839DC00285FD0012865D002282ED150 +:10732000B0202058C0680EE006281CD0072823D0C3 +:107330000F2824D1B0202058C069002803D11EE0B6 +:10734000B02020580068FEF7E1FC0246207C01A92D +:1073500090472FE0B420205800282CD0217C002911 +:1073600022D0C06A21E0207C002808D1B420205817 +:10737000002804D0406B18E0207C00280ED0204666 +:10738000294600F091FB25E0032829D004282FD0BE +:107390000528F4D1B02020588069D4E7B4202058C3 +:1073A0000028ECD0006B00E0806AFEF7AFFC0146DD +:1073B00001A88847014601A80288002A0AD0E88867 +:1073C000002807D0824200D3024601A8028020464E +:1073D00000F020FC02B0B0BDB02020584068B2E7F9 +:1073E000B02020580069AEE7B02020588068AAE796 +:1073F000B02020584069A6E770B504468888002868 +:107400000BD1C888002808D148887F2606409C20D8 +:10741000205C25469C35032803D1204600F044FB20 +:1074200070BD9E202654F1B22046FFF731FD204664 +:1074300000F01AFC002E02D00220287070BD01203E +:10744000287070BD70B50D460446AE78022E1DD270 +:107450009C20215C20469C30032907D0022915D1AD +:10746000002E22D066600321017009E0002E12D0A8 +:107470006068B04219D0C1B22046FFF7A8FD66602F +:1074800020463146FFF788FD02280ED120462946C6 +:1074900000F00AFB70BD0221017066602046314693 +:1074A000FFF795FD204600F0DFFB204600F0DCFBF7 +:1074B00070BD80B5CA88012A0AD19C22825C032A49 +:1074C00009D0022A04D1002181600146083103E07D +:1074D00000F0EAFA80BD011D012200F09BFB80BD97 +:1074E000B0B504469C20205CFE220240022A15D141 +:1074F0000120E060A420215825460C3503200029F6 +:1075000005D0204600F0BCFBE16802200843E060A3 +:1075100002222046294600F07DFBB0BD204600F047 +:10752000C3FAB0BDB0B50D4604466888012815D130 +:10753000A42001212150287902280CD8C00020184D +:10754000B4214058002806D08068FEF7DFFB0246D1 +:10755000204629469047204600F086FBB0BDB0B5D6 +:107560000D4604469C20205CFE210140022919D1D1 +:10757000688801281AD1A4200021215028790228E6 +:107580000CD8C0002018B4214058002806D08068CC +:10759000FEF7BCFB0246204629469047204600F0F5 +:1075A00063FBB0BD2046294600F07EFAB0BDB0B501 +:1075B0000D4604469C20205C032816D12879022819 +:1075C00013D8C0002018B421405800280DD080687E +:1075D000FEF79CFB0246204629469047E888002893 +:1075E00007D1204600F040FB03E02046294600F08A +:1075F0005BFA0020B0BDB0B50D4604462878602285 +:1076000002402979202A0FD102290DD8C80020185C +:10761000B4228058002807D08068FEF777FB024626 +:1076200020462946904769E06878002816D001284E +:107630001DD0032862D19C20205C03281BD16888C0 +:10764000002807D180200843802803D02046FFF778 +:10765000C3FB297902294ED8C80040E09C20205C59 +:10766000032817D0022810D148060AD146E09C20F2 +:10767000205C032827D0022807D1802008438028D7 +:107680003CD02046FFF7A8FB38E02046294600F012 +:107690000BFA33E07F2008400001201805465435DE +:1076A00014308022114200D005462046FFF7DEFB51 +:1076B0000121002800D101462960022220462946E6 +:1076C00000F0A8FA1AE06888002817D1480612D0FE +:1076D0002046FFF7A7FB287902280CD8C000201805 +:1076E000B4214058002806D08068FEF70FFB024600 +:1076F000204629469047204600F0B6FA0020B0BD4B +:107700000A7802704A7842708A78CB781B02134359 +:1077100043800A794B791B02134383808A79C979A4 +:1077200009021143C180704710B504468021FFF75C +:1077300053FB00212046FFF74FFB10BD70B582B010 +:107740000D46044601A900200880694608702A7881 +:1077500060211140002910D0202938D169780A46CB +:107760000A3A022A33D302291BD0032919D0204612 +:10777000294600F099F9022029E069780B2913D0F5 +:107780000A290ED0062922D16888000A0022212861 +:107790000ED02228114616D101AE304600F058F81E +:1077A0000AE0694601220EE0204600F05DFA0DE095 +:1077B00001AE304600F032F801463288E888824255 +:1077C00000D302463280204600F024FA0020C0B2E6 +:1077D00002B070BDF0B581B0044682210326402579 +:1077E00032462B46FFF7B2FA022720463946324688 +:1077F0002B46FFF7ABFA204639462A46FFF773FBC4 +:10780000002001B0F0BD10B504468221FFF7CEFA8A +:1078100002212046FFF7CAFA002010BDAC21094A18 +:10782000515C0922012905D0002906D10749794474 +:10783000092204E00449794401E000221146028053 +:1078400008467047F4210020D2260000E6260000FA +:10785000F0B581B00446AC201349085C2221002811 +:1078600019D001281AD110488121032740263A4611 +:107870003346FFF76BFA01250B4829463A46334653 +:10788000FFF764FA084829463246FFF72CFB084800 +:107890007844222104E00548784401E000210846AC +:1078A000218001B0F0BDC046F4210020A7260000D1 +:1078B0008D260000F0B581B00446812103264025C5 +:1078C00032462B46FFF742FA012720463946324618 +:1078D0002B46FFF73BFA204639462A46FFF703FBC3 +:1078E000002001B0F0BD000080B5012903D103489C +:1078F0000121FEF75BFE002080BDC0465421002020 +:10790000B0B5144601290DD1012540222946FFF7C3 +:10791000EAFA2846FDF750FB0246034821462B466B +:10792000FEF7A6FF0020B0BD5421002080B502293B +:1079300003D103487844FDF79FFF002080BDC04677 +:1079400051D7FFFFB0B51446022919D102214022B8 +:10795000FFF7C9FA0B4DA879002811D10220FDF7D5 +:107960002BFB0246094878442146FDF7CBFE02284E +:1079700006D1072028700120A8710348006868809C +:107980000020B0BD34210020DC2100201FD7FFFFE4 +:1079900070B504468321032540262A463346FFF767 +:1079A000D5F9204629462A463346FFF7CFF9204627 +:1079B00029463246FFF797FA002070BD0020704735 +:1079C0000020704780B5032903D103487844FDF7B0 +:1079D00053FF002080BDC046C9D6FFFFB0B5144696 +:1079E000032919D103214022FFF77DFA0B4DA87915 +:1079F000002811D10320FDF7DFFA02460948784438 +:107A00002146FDF77FFE022806D10B2028700520B5 +:107A1000A8710348006868800020B0BD34210020B0 +:107A2000DC21002097D6FFFF12200880014878440F +:107A30007047C046B62700000420088001487844FB +:107A40007047C046B82700000E20088001487844DF +:107A50007047C046AC2700000E20088001487844DB +:107A60007047C046AA2700000A20088001487844D1 +:107A70007047C046A82700000E20088001487844BF +:107A80007047C0468A2700000E20088001487844CD +:107A90007047C0467A2700003920088001487844A2 +:107AA0007047C046C324000080B50A7852B2002A4D +:107AB00002DBFFF739FE80BD4A78772A0FD0062A0D +:107AC000F7D14A88194B9A42F3D1CA881221122A57 +:107AD00000D30A461649794400F09CF880BD8A8894 +:107AE000042A09D1CA882821282A00D30A46114924 +:107AF000794400F08FF880BD8A88052A09D1CA88A8 +:107B00009221922A00D30A460B49794400F082F868 +:107B100080BD8A88072ACCD1CA88B221B22A00D374 +:107B20000A460649794400F075F880BDEE0300006E +:107B3000E6240000DE240000EC24000064250000A0 +:107B400070B5044623480025D4222946FDF7BBF929 +:107B5000214E30460C3004222946FDF7B4F9103688 +:107B6000082230462946FDF7AEF9002C2DD0194CDD +:107B70000025D42220462946FDF7A5F91949794464 +:107B800020462A46FFF7C2F9174A7A44284621467A +:107B9000FFF7F0F90120154A7A442146FFF7EAF988 +:107BA000FF2252320D480E49FEF7F6FC0220104A21 +:107BB0007A442146FFF7DEF9032140222046FFF7F1 +:107BC00092F92046FFF7E3F970BD0248FFF7B7F9D5 +:107BD00070BDC046F4210020342100205421002033 +:107BE000E01F00201E240000B2250000DC2500005C +:107BF000FC25000060210180014878447047C046A0 +:107C0000262600000A210180014878447047C046BA +:107C100076260000B0B50C46942102234350D021B3 +:107C200044508261C261016A914200D80A4693B20F +:107C3000002529462246FFF73DF92846B0BDB0B5DC +:107C40000C46016A914200D80A4693B200252946A3 +:107C50002246FFF72FF92846B0BD10B50024214673 +:107C6000FFF741F9204610BD10B59421042242507F +:107C70000024214622462346FFF71CF9204610BD6A +:107C800010B5942105224250002421462246FFF7D8 +:107C90002AF9204610BD0000B0B512490A7801202B +:107CA000012A1DD8521E0C235343CB181A8B002ACD +:107CB00016D01969002913D09B8A002B06D1940095 +:107CC0000C190325ED436459E41C09D1934206D2F3 +:107CD0009A0089180322D2438958891C00D00020B9 +:107CE000B0BDC0461C1D002010B50E490A78012009 +:107CF000012A16D8521E0C235343CB181A8B002A84 +:107D00000FD0196900290CD09B8A541E9C4208DDB3 +:107D1000921E9A4204DD9A0089184968891C00D095 +:107D2000002010BD1C1D00200848017800290AD041 +:107D30000C224A4380184189028901208A4203D8D3 +:107D4000FF208A4200D3002040B270471C1D002053 +:107D5000F0B581B00146164A1078012826D8401E99 +:107D60000C234343D218168B002E1FD01569002D0B +:107D70001CD0022E1AD3948A13461433771EA742BE +:107D800014DDB61EA6420ADBA600AD196D68AE1C56 +:107D90000CD0ED1C03D100211980D18204E0D482E3 +:107DA000621C1A80002901D000F03EF801B0F0BD3D +:107DB0001C1D002080B50120FFF7CAFF80BD000018 +:107DC000B0B517490878012829D8401E0C22424333 +:107DD00089180A8B002A22D00C69002C1FD0022A95 +:107DE0001DD38D8A0B461433002D0AD0AA00A21889 +:107DF0000324E4431259921C11D0CD82691E1980CC +:107E00000BE0950064190325ED436459E41C06D189 +:107E1000044C14191C80521ECA8200F005F8B0BD33 +:107E20001C1D0020FEFF0000F0B581B004460C20B0 +:107E300060431A490E183069B18A890040583746A4 +:107E4000143710360321C943884224D8FDF75EFF5A +:107E500031683A889200895805680846FDF756FF50 +:107E6000002D06D00068FDF751FF014620468847E7 +:107E700011E08068FDF74AFF0546306839888900BF +:107E80004058FDF743FF4068FDF740FF024620469B +:107E9000294600F061F801B0F0BDC0461C1D00206D +:107EA000F0B581B02B4D2878012825D8401E0C262E +:107EB00070432A18108B00281ED0116900291BD08E +:107EC000928A824218D290000858FDF71FFF8068FE +:107ED00029784C1E6643002810D0A8190169808AB1 +:107EE00080000858FDF712FF8068FDF70FFF01467C +:107EF0000022204600F030F801B0F0BDA819038B35 +:107F0000002BF9D0828A014614319B1E9342F3DB89 +:107F100005699600AE1900967768FE1C13D0BE1C4A +:107F2000EAD1009E7668B61C09D1521C96B2B342C3 +:107F300004DBB600AE197668B61CF6D00A80C282A1 +:107F4000501C088002E000220A80C2822046FFF70F +:107F50006BFFD1E71C1D0020F0B583B001920C46E9 +:107F60000C221146029041431F4B5F1800213983B8 +:107F700039617961181DFCF7A6FF20463C46103494 +:107F80003D4618353E461636143700282AD0FDF7F0 +:107F9000BDFE206029888A008258521C06D0491CE8 +:107FA0008AB292008258521CF9D129800198002887 +:107FB00015D0FDF7ABFE054620683988890040588A +:107FC0000BE0FDF7A3FEA84209D038883080401CA2 +:107FD000388080B2800021680858411CF1D1029895 +:107FE000FFF722FF03B0F0BD1C1D002080B50A4939 +:107FF000884208D00949884208D00949884208D1F6 +:10800000FFF7DEFE05E0FFF74BFF02E00120FFF780 +:108010009FFE002080BDC04603000080020000805B +:108020000100008010B50146002000290FD1084C46 +:10803000218BA28A8A420AD22069FDF767FEA18AB3 +:1080400089004058FDF762FE4068FDF75FFE10BDF5 +:108050001C1D002080B503480078401EFFF7E2FF9A +:1080600080BDC0461C1D002010B5044600F04EFC2B +:108070002420604308490818C42105224254C02125 +:10808000064A7A444250BD2101224254D021044A7A +:108090007A44425010BDC0461C1D00200A22000038 +:1080A00059FFFFFF80B500F041FB9D22002806D05C +:1080B00003498A5C112A02D1B422024B8B5280BD43 +:1080C0001C1D00200A80000010B50446FFF7CCFFFD +:1080D0002420604304490818CC21044A7A444250C1 +:1080E000204600F0E9FB10BD1C1D0020C5FFFFFF6E +:1080F00080B500F01BFB9D22002806D003498A5C56 +:10810000102A02D3B422024B8B5280BD1C1D0020CA +:108110000A80000010B50446FFF7A6FF2420604344 +:1081200004490818CC21044A7A444250204600F001 +:10813000C3FB10BD1C1D0020C5FFFFFF70B5054629 +:10814000FFF788FF0446114E30469C302022294616 +:10815000FCF7A3FE68780146103905290AD29D2054 +:10816000305C0F21014088002058B82170509C36A7 +:10817000304670BD022803D00128F8D1616800E0C4 +:10818000E16800200029F2D1F3E7C0461C1D002061 +:1081900010B5044600F0BAFB242060430B490818D0 +:1081A000C42106224254C021094A7A444250BD21CA +:1081B00001224254CC21074A7A444250D021064A37 +:1081C0007A444250204600F077FB10BD1C1D002071 +:1081D0008221000081FFFFFF29FEFFFFF0B587B07D +:1081E0000E46FFF71FFF06904B4C20460C30002533 +:1081F000022729463A46FCF766FE20460E300595D2 +:1082000029463A46FCF75FFE701C049002D0A06835 +:1082100000287DD006984068FDF778FD054600F0FF +:10822000EBFE291801220592012871DB6068059098 +:10823000A068029000200390069001952B468B4287 +:10824000039C1A4620D200201A46044626469D1951 +:10825000C01D741C722813D82F781F2F04DD202F07 +:1082600009D02D2F07D003E0092F04D00A2F09D001 +:108270005F2F00D015462A461D198D42E6D303E034 +:10828000344601E09A19741C1819884224D2002C33 +:10829000069D22D09A4220D00025ED43455D2C2D2D +:1082A00006DC2E46093E022E16D3202D14D003E004 +:1082B0002D2D11D05F2D0FD000782C2805DC054620 +:1082C000093D022D08D3202802E02D2804D05F2884 +:1082D000069D02D0D41A00E0069D0498002806D01E +:1082E0000598A84203D10598029A90420AD31B1917 +:1082F000681C8B4200D328468B4206909FD3401CBB +:10830000059005E004480146CC810198181A88813F +:10831000059807B0F0BDC0461C1D0020B0B504464E +:10832000FFF7A2FE094D69682046FFF757FF24209A +:1083300060432818CC21064A7A444250D021054A8D +:108340007A444250204600F0B7FAB0BD1C1D002010 +:108350001D00000015010000F0B583B00546FFF7D1 +:1083600079FE0446374E30469C3020222946FCF7E1 +:1083700094FD6878102816DC012833D002283BD001 +:1083800010285AD12068002841D0B468FDF7BEFCFF +:1083900003467068B1686A46401C03C2012C41D88C +:1083A0002A4A7A4440E001461139032945D20F2177 +:1083B0000840401E40003718FD89002D3DD0606800 +:1083C000FDF7A4FCB98940186946086034461C349E +:1083D0008021204A7A4420462B46FDF7C3FAB82074 +:1083E00034502AE0FFF758FC01460020002924D031 +:1083F0007168002923D020E0FFF776FC00281CD00C +:108400007168B068421E0020914216D117E0716871 +:10841000B0686A46106030461C304B1C80210C4A04 +:108420007A4404E0084A7A4430461C308021FDF743 +:1084300099FA30461C30B82170509C36304603B053 +:10844000F0BDC0461C1D0020C61F000051130000D7 +:10845000D71F00002920000080B5174988420BD0A3 +:108460001649884213D01649884222D115484168DE +:1084700000291CD0491E14E012498868002803D046 +:108480004968401E884214D1FFF70AFD11E00D48EB +:1084900041688268521E914202D1FFF78BFC08E0CE +:1084A000491C41600078401EFFF738FF01E0FFF7EC +:1084B00087FC002080BDC0460300008002000080D1 +:1084C000010000801C1D002070B50446FFF72CFC45 +:1084D00001280BD0401C0FD11C4E301D00250C2252 +:1084E0002946FCF7F0FCE843706005E01748001DE2 +:1084F00000210C22FCF7E7FC204600F007FA20469A +:10850000FFF790FD4068002819D00020C1432046A5 +:10851000FFF764FE0D4DA860002807D1281D00213B +:108520000C22FCF7D0FCA868002804D0401E696823 +:10853000814200D968602046FFF7F0FE70BD034815 +:10854000001D00210C22FCF7BEFC70BD1C1D00208C +:1085500070B50546FFF77EFD0446124E30469C304E +:1085600020222946FCF799FC68780F2806DC0128B0 +:108570000AD0022812D1FFF7B7FB07E010280AD073 +:1085800011280BD1606807E0FFF786FB0146002049 +:10859000002903D070BD2068B82170509C36304649 +:1085A00070BDC0461C1D002010B5044600F0AEF999 +:1085B000242060430B490818C42105224254C021DD +:1085C000094A7A444250BD2101224254CC21074A33 +:1085D0007A444250D021064A7A444250204600F064 +:1085E0006BF910BD1C1D0020421E00007DFFFFFF27 +:1085F00011FAFFFF70B50546FFF72CFD0446164E35 +:1086000030469C3020222946FCF747FC68780F282A +:1086100007DC012812D0022813D00F2818D12068B7 +:1086200009E01038022813D29D20305C0F21014050 +:10863000880020184068B821705009E0FFF72CFB33 +:1086400001E0FFF751FB01460020002900D070BD7A +:108650009C36304670BDC0461C1D002010B5044637 +:1086600000F054F92420604308490818C421062268 +:108670004254C021064A7A444250BD21012242544C +:10868000D021044A7A44425010BDC0461C1D00202F +:108690002E1E000065F9FFFF10B5044600F036F904 +:1086A000242060430B490818C42106224254C021EB +:1086B000094A7A444250BD2101224254D021074A3E +:1086C0007A444250CC21064A7A444250204600F077 +:1086D000F3F810BD1C1D0020F21D000029F9FFFF5A +:1086E00029FFFFFF80B5FFF785FF9D22002806D0F8 +:1086F00003498A5C102A02D3B4220A238B5280BD1C +:108700001C1D002010B50446FFF7A8FF242060437D +:1087100004490818CC21044A7A444250204600F00B +:10872000CBF810BD1C1D0020C9FFFFFF70B505462A +:10873000FFF790FC0446124E30469C30202229461A +:10874000FCF7ABFB6878022804D0012809D1FFF7B9 +:10875000A3FA01E0FFF7C8FA0146002000290BD078 +:1087600070BD9D20305CF021084205D00F210840EB +:1087700080002058B82170509C36304670BDC046ED +:108780001C1D0020B0B51749884211D016498842F7 +:1087900015D01649884222D1F820154C2158E025E1 +:1087A0006059401E8847002819D06059401E11E0CA +:1087B000E0200F490858FC22895888470FE0F8202C +:1087C0000B4C2158E0256059401C8847002806D0F2 +:1087D0006059401C60512078401E00F00BF80020CA +:1087E000B0BDC04603000080020000800100008090 +:1087F0001C1D0020F0B581B004460120C6430C4D7D +:108800002F46E437F8202958E020285830188847A8 +:1088100001C7761C032EF5D12046FFF7B9FC2420B2 +:1088200060432818D021034A7A44425001B0F0BD79 +:108830001C1D002059FFFFFFB0B50446F8200B4D6A +:108840002950E0202B50FC202A502046FFF7EAFB5D +:10885000E435A84206D00649794400222046FFF7B5 +:108860007BFBB0BD2046FFF7C5FFB0BD1C1D00203F +:108870001C1D000080B50023FFF7DEFF80BD000057 +:10888000B0B50C4D2878002811D12846BC30002402 +:1088900024222146FCF717FB28780C225043281885 +:1088A00010302146FCF70FFB2878401C2870C0B21E +:1088B000401EB0BD1C1D0020B0B504461248027811 +:1088C000002A0ED0611C91420BD12421614345182E +:1088D000FCF76CFCBE2000212952204600F02AF84B +:1088E000B0BD01210023002A0A4600D01A46641CAC +:1088F00000D019461143012904D14178AA2901D198 +:1089000069214170B0BDC0461C1D002070B52424F3 +:10891000604307490E18FCF749FC3046BC3000257F +:1089200029462246FCF7CFFABC20355470BDC0461C +:108930001C1D0020F0B581B004460420FDF7ACFCFE +:1089400000283CD097283AD0242060431D490C18B9 +:10895000C02020582546C0352646BE3600282ED0D9 +:108960002046CC300090C4343088AA27217880B2C9 +:10897000884224D2FDF75CFC002820D1FDF7DAFB09 +:10898000B84203D1FDF700FCB84218D128683188FD +:108990004901401800990968002902D08847002839 +:1089A00007D0012803D12868318849014018FBF716 +:1089B00003FA3088401C308029680029D6D101B0E4 +:1089C000F0BDC0461C1D0020002243088B4274D31A +:1089D00003098B425FD3030A8B4244D3030B8B42C0 +:1089E00028D3030C8B420DD3FF22090212BA030CC9 +:1089F0008B4202D31212090265D0030B8B4219D3AA +:108A000000E0090AC30B8B4201D3CB03C01A5241C9 +:108A1000830B8B4201D38B03C01A5241430B8B4211 +:108A200001D34B03C01A5241030B8B4201D30B03FA +:108A3000C01A5241C30A8B4201D3CB02C01A524121 +:108A4000830A8B4201D38B02C01A5241430A8B42E4 +:108A500001D34B02C01A5241030A8B4201D30B02CD +:108A6000C01A5241CDD2C3098B4201D3CB01C01AE7 +:108A7000524183098B4201D38B01C01A52414309F1 +:108A80008B4201D34B01C01A524103098B4201D3DF +:108A90000B01C01A5241C3088B4201D3CB00C01A4C +:108AA000524183088B4201D38B00C01A52414308C4 +:108AB0008B4201D34B00C01A5241411A00D20146E9 +:108AC000524110467047FFE701B5002000F0F0F872 +:108AD00002BDC0460029F7D076E7704703460B4336 +:108AE0007FD4002243088B4274D303098B425FD3A7 +:108AF000030A8B4244D3030B8B4228D3030C8B42D3 +:108B00000DD3FF22090212BA030C8B4202D31212B8 +:108B1000090265D0030B8B4219D300E0090AC30B8D +:108B20008B4201D3CB03C01A5241830B8B4201D33A +:108B30008B03C01A5241430B8B4201D34B03C01A23 +:108B40005241030B8B4201D30B03C01A5241C30A9B +:108B50008B4201D3CB02C01A5241830A8B4201D30C +:108B60008B02C01A5241430A8B4201D34B02C01AF6 +:108B70005241030A8B4201D30B02C01A5241CDD29B +:108B8000C3098B4201D3CB01C01A524183098B42E6 +:108B900001D38B01C01A524143098B4201D34B01CF +:108BA000C01A524103098B4201D30B01C01A524132 +:108BB000C3088B4201D3CB00C01A524183088B42B9 +:108BC00001D38B00C01A524143088B4201D34B00A2 +:108BD000C01A5241411A00D2014652411046704714 +:108BE0005DE0CA0F00D04942031000D34042534019 +:108BF00000229C4603098B422DD3030A8B4212D3D9 +:108C0000FC22890112BA030A8B420CD3890192110A +:108C10008B4208D3890192118B4204D389013AD047 +:108C2000921100E08909C3098B4201D3CB01C01A1C +:108C3000524183098B4201D38B01C01A524143092F +:108C40008B4201D34B01C01A524103098B4201D31D +:108C50000B01C01A5241C3088B4201D3CB00C01A8A +:108C6000524183088B4201D38B00C01A5241D9D2A2 +:108C700043088B4201D34B00C01A5241411A00D223 +:108C80000146634652415B10104601D34042002B1F +:108C900000D54942704763465B1000D3404201B59E +:108CA000002000F005F802BD0029F8D016E7704753 +:108CB0007047C04610B5002200F00AF810BDC0464B +:108CC00010B500F031F810BD10B500F07FF810BD00 +:108CD0000B0010B511001A0000F0D4F810BDC0460A +:108CE00030B5032A0CD903000B439B0719D1036845 +:108CF0000C68A34215D1043A04300431032AF6D893 +:108D0000551E002A0BD0002303E05A1C9D4206D0BA +:108D10001300C25CCC5CA242F7D0101B00E0002024 +:108D200030BD551EEFE7C046F0B5C64600B50F2A68 +:108D300041D903270D003E0005430C0003002E40DF +:108D40002F423DD11500103D2D09AC462D01A846FE +:108D50008044256867681D605F60A568E7689D605E +:108D6000DF6010341F0010334745F2D165460F23F2 +:108D70000C2401352D01491913404519144222D004 +:108D80008C59AC5104369C1B032CF9D80324043BAA +:108D90009B0801339B002240ED18C918561E002A7B +:108DA00006D00023CC5C1A00EC5401339642F9D172 +:108DB00080BCB846F0BD0500561E002AF1D1F7E789 +:108DC0000500561EEDE71A00F6E7C046F0B5C646A8 +:108DD00000B588420CD98B18984209D2531E002A3C +:108DE00003D0CA5CC254013BFBD280BCB846F0BD84 +:108DF0000F2A0BD80500561E002AF6D00023CC5CA3 +:108E00001A00EC5401339642F9D1EEE703270D0026 +:108E10003E0005430C0003002E402F422CD11500CC +:108E2000103D2D09AC462D01A846804425681F0041 +:108E30001D6065685D60A5689D60E5681034DD6053 +:108E400010334745F2D165460F230C2401352D011F +:108E5000491913404519144211D08C59AC510436AC +:108E60009C1B032CF9D80324043B9B0801339B0073 +:108E7000ED18C9182240BEE70500561EBEE71A00CD +:108E8000B9E7C046F0B5050083074AD0541E002A52 +:108E900044D003000322CEB202E00135013C3DD3B1 +:108EA00001332E701342F8D1032C2FD9FF220A4030 +:108EB000150215432A0415430F2C35D92700103FFE +:108EC0003F093E01B4461E001A0010366644156084 +:108ED00055609560D5601032B242F8D10F260C2251 +:108EE00001373F012640DB193700224217D03E1FD1 +:108EF000B608B400A4461A001C1D644420C2A24255 +:108F0000FCD103240136B6009B193C40002C05D04F +:108F1000C9B21C19197001339C42FBD1F0BD340059 +:108F2000F4E714000300BFE72700E0E7F0C0414684 +:108F30004A4653465C466D4676467EC02838F0C8A1 +:108F40000020704710307CC890469946A246AB4638 +:108F5000B54608C82838F0C8081C00D101201847B9 +:108F6000024670B50A4392072AD11E4DEE0104C88D +:108F700008C9541B9443344017D0D0B2D9B2401A18 +:108F80002106014310D190B299B2401A2104014345 +:108F90000AD110021902000A090A401A21020143EB +:108FA00002D1100E190E401A70BD9A42DFD010BACD +:108FB00019BA884201D9012070BD0020C04370BD9C +:108FC00002780B7801300131002A09D09A4207D18A +:108FD00002780B7801300131002A01D09A42EFD09B +:108FE000D01A70BD0101010103000A7801311A7025 +:108FF0000133002AF9D1704710B583070AD0030066 +:10900000032102E001330B4205D01A78002AF9D17E +:10901000181A10BD030019680C4A0D4C8A188A43AF +:1090200022420FD15968094A04338A188A432242DE +:1090300008D15968054A04338A188A432242F1D07C +:1090400000E001331A78002AFBD1E1E7FFFEFEFEC3 +:109050008080808030B5002A28D003000B439B0716 +:1090600013D1032A11D9134D0BE0043A002A1DD065 +:10907000114C1C199C432C4218D104300431032A92 +:1090800003D903680C68A342EFD004780D78A54299 +:109090000ED1012A0AD0012306E0C45CCD5CAC42AB +:1090A00006D101339A4201D0002CF6D1002030BD08 +:1090B000601BFCE780808080FFFEFEFEF0B50C00A8 +:1090C000044303000600A40712D1032A10D9144C4C +:1090D000A44666460D68134C1F002C19AC4334425D +:1090E0001CD10433043A1E0004313D60032AF0D839 +:1090F0000024B71806E00D5D013A3555BB1A01345E +:10910000002D02D0002AF6D1F0BD0021D418002A8B +:10911000FAD0197001339C42FBD1F5E71E00E7E756 +:1091200080808080FFFEFEFE30B5050008002B0029 +:109130006C18002903D106E001339C4203D01A7851 +:10914000002AF9D1581B30BD25303858001976A9AE +:109150001488AC17A914873DA91487209EC9845A86 +:10916000CB02FAB24E1C0368B3B517C1A4488FBA3C +:1091700097F0E3459AC053EA0100000003C01F02C4 +:10918000B41600142200203F76A91488AC209EC992 +:10919000845ACB02FAB24E1C0368B3B517C1A44877 +:1091A0008FBA97F0E3459AC053EA0100000003C06C +:1091B0001F02B42575003132333435363738394122 +:1091C000424344454647484A4B4C4D4E50515253FA +:1091D0005455565758595A616263646566676869A1 +:1091E0006A6B6D6E6F707172737475767778797A59 +:1091F000205369676E6564204D6573736167653AD6 +:109200000AE0E0E0E0E0E0E0E0E0E0E0E0E02022B2 +:109210002426404244484A4EC0C4160101000101C0 +:109220000101010101000000DD17D0C0191DD0C0EF +:109230007103D0C01917D0C0C105D0C01D04D0C063 +:109240005D12D0C04D14D0C09D10D0C0A91CD0C09C +:10925000E503D0C02503D0C05502D0C06269746355 +:109260006F696E636173680071707A7279397838EA +:10927000676632747664773073336A6E35346B6840 +:109280006365366D7561376C0000000000000000FA +:10929000FFFFFF000000FEC1FF3030EC0D03C3DE16 +:1092A0003030EC0D03C3C0F03FF8070000000000B1 +:1092B0000E0000000E000000010000008C92D0C0E3 +:1092C0009492D0C000000000FFFFFF0000000000EB +:1092D0000C400BF807FCC0F3F03CF003FE012D003E +:1092E00003000000000000000E0000000E0000005F +:1092F00001000000C492D0C0CC92D0C00000000099 +:10930000FFFFFF00008001E6C071383807FC001E37 +:109310008007F003CEC1E13870061800000000009D +:109320000E0000000E00000001000000FC92D0C002 +:109330000493D0C000000000FFFFFF000000000009 +:109340000C8007F003FEC1FFF03FF003CC0033C0F8 +:109350000C000000000000000E0000000E000000E5 +:10936000010000003493D0C03C93D0C00000000046 +:10937000FFFFFF004111050107000000040000008D +:10938000010000006C93D0C07493D0C000000000B6 +:10939000FFFFFF00000000001EE01F1C0E03638C97 +:1093A00019630C0C87837F80070000000000000019 +:1093B0000E0000000E000000010000008C93D0C0E1 +:1093C0009493D0C000000000FFFFFF004812420845 +:1093D000040000000700000001000000C493D0C09A +:1093E000CC93D0C000000000FFFFFF0021842401C7 +:1093F000040000000700000001000000E493D0C05A +:10940000EC93D0C000000000FFFFFF00088A28088E +:109410000700000004000000010000000494D0C018 +:109420000C94D0C000000000FFFFFF00000000000F +:109430000000C000380067E0381C9C037E000F80ED +:1094400001000000000000000E0000000E000000FF +:10945000010000002494D0C02C94D0C00000000073 +:10946000FFFFFF00000030000C80072001CC00331C +:10947000E01C3807FFC3F3F87CFE1F00000000006B +:109480000E0000000E000000010000005C94D0C03F +:109490006494D0C04175746F20417070726F7661B2 +:1094A0006C004D616E75616C20417070726F7661F9 +:1094B0006C004261636B005075626C6963206B6580 +:1094C0007973206578706F7274004170706C696395 +:1094D0006174696F6E00697320726561647900530D +:1094E000657474696E67730056657273696F6E0098 +:1094F000312E352E330051756974005369676E0043 +:109500006D657373616765004D6573736167652091 +:10951000686173680043616E63656C007369676EB0 +:109520006174757265005265766965770074726161 +:109530006E73616374696F6E00416D6F756E740058 +:1095400041646472657373004665657300416363CB +:1095500065707400616E642073656E640052656AA4 +:10956000656374004F505F53454E44455200436F4E +:109570006E6669726D005468652064657269766113 +:1095800074696F6E007061746820697320756E7500 +:109590007375616C210044657269766174696F6EE0 +:1095A00020706174680052656A6563742069662082 +:1095B000796F75277265006E6F7420737572650020 +:1095C000417070726F766520646572697661746946 +:1095D0006F6E00417070726F766500436F6E6669E2 +:1095E000726D20746F6B656E004578706F727400D9 +:1095F0007075626C6963206B65793F005468652003 +:109600006368616E676520706174680069732075B6 +:109610006E757375616C004368616E67652070617B +:10962000746800546865207369676E20706174689F +:10963000005369676E207061746800556E766572BC +:10964000696669656420696E70757473005570642D +:1096500061746500204C6564676572204C697665AD +:10966000006F72207468697264207061727479008E +:1096700077616C6C657420736F66747761726500D6 +:10968000436F6E74696E756500554E4B4E4F574E65 +:1096900000524557415244004F505F53454E444598 +:1096A000525F435245415445004F505F435245413C +:1096B0005445004C0E968C0044656C65676174657A +:1096C00020746F2025732028666565202564202579 +:1096D0002529003D666E8B00303132333435363704 +:1096E00038394142434445460043616C6C20636F06 +:1096F0006E7472616374202573006F6D6E69004F24 +:109700004D4E4920005553445420004D41494420BA +:10971000004F4D4E4920617373657420256420000D +:10972000252E2A482E2E2E252E2A48006F7574705D +:10973000757420232564005174756D005154554D86 +:10974000007471009494D0C0A294D0C0B294D0C0E0 +:10975000B794D0C0B294D0C0CA94D0C0D694D0C070 +:109760001581D0C05897D0C0000000000000000054 +:10977000593CD0C0000000000000000000000000C4 +:109780007097D0C0FFFFFFFFE892D0C0DF94D0C039 +:10979000A985D0C08897D0C08097D0C000000000B5 +:1097A000E894D0C0F094D0C0C980D0C0A097D0C0F9 +:1097B0000000000000000000753CD0C00000000068 +:1097C0000000000000000000B897D0C0FFFFFFFFBE +:1097D0005893D0C0F694D0C0A985D0C0D097D0C03F +:1097E000C897D0C0000000006097D0C09097D0C04C +:1097F000A897D0C0D897D0C0FDFFFFFFFFFFFFFFA5 +:10980000B092D0C0FB94D0C00095D0C00587D0C026 +:109810000098D0C000000000000000000895D0C0F3 +:1098200000180020C984D0C01C98D0C000000000DF +:10983000000000007F3CD0C00000000000000000DD +:10984000000000003498D0C0FFFFFFFF4894D0C054 +:10985000FB94D0C00095D0C09986D0C04C98D0C0A1 +:109860004498D0C0000000008D3CD0C00000000033 +:1098700000000000000000006898D0C0FFFFFFFF5C +:109880002093D0C01595D0C01C95D0C09986D0C06B +:109890008098D0C07898D0C0000000000C98D0C04C +:1098A0002498D0C05898D0C08C98D0C0FFFFFFFF3C +:1098B000B093D0C02695D0C0551800200587D0C0E1 +:1098C000B098D0C000000000000000003995D0C062 +:1098D00041180020C984D0C0CC98D0C0000000003E +:1098E000000000004095D0C000180020C984D0C0FE +:1098F000E498D0C000000000000000009B3CD0C0F5 +:10990000000000000000000000000000FC98D0C033 +:10991000FFFFFFFF4894D0C04D95D0C0A985D0C0AF +:109920001499D0C00C99D0C000000000AF3CD0C04A +:109930000000000000000000000000002C99D0C0D2 +:10994000FFFFFFFF2093D0C05D95D0C0A985D0C098 +:109950004499D0C03C99D0C000000000BC98D0C051 +:10996000D498D0C0EC98D0C01C99D0C04C99D0C02D +:10997000FFFFFFFFB093D0C06E95D0C02D95D0C033 +:109980000587D0C07499D0C000000000000000001E +:109990004895D0C055180020C984D0C09099D0C037 +:1099A0000000000000000000C33CD0C00000000028 +:1099B0000000000000000000A899D0C0FFFFFFFFDA +:1099C0004894D0C04D95D0C05495D0C09986D0C091 +:1099D000C099D0C0B899D0C000000000D73CD0C01A +:1099E000000000000000000000000000DC99D0C072 +:1099F000FFFFFFFF2093D0C05D95D0C0A985D0C0E8 +:109A0000F499D0C0EC99D0C000000000EB3CD0C06D +:109A10000000000000000000000000000C9AD0C010 +:109A2000FFFFFFFF4894D0C0FB94D0C06495D0C026 +:109A30009986D0C0249AD0C01C9AD0C000000000E3 +:109A40008099D0C09899D0C0CC99D0C0FC99D0C092 +:109A5000FFFFFFFF8099D0C09899D0C0309AD0C046 +:109A6000FC99D0C0FFFFFFFF8094D0C07695D0C096 +:109A70008595D0C00587D0C0689AD0C0000000008E +:109A8000000000009695D0C000180020C984D0C006 +:109A9000849AD0C00000000000000000FF3CD0C04D +:109AA0000000000000000000000000009C9AD0C0F0 +:109AB000FFFFFFFF2093D0C0A695D0C0B795D0C0C0 +:109AC0000587D0C0B49AD0C0AC9AD0C000000000C6 +:109AD0004894D0C0C095D0C01E96D0C00587D0C0D5 +:109AE000D09AD0C000000000000000004095D0C017 +:109AF000A8200020C984D0C0EC9AD0C0000000008B +:109B0000000000000D3DD0C000000000000000007B +:109B100000000000049BD0C0FFFFFFFF4894D0C0AE +:109B2000D395D0C0A985D0C01C9BD0C0149BD0C0F9 +:109B3000000000001B3DD0C000000000000000003D +:109B400000000000349BD0C0FFFFFFFF2093D0C077 +:109B50005D95D0C0A985D0C04C9BD0C0449BD0C0DF +:109B600000000000749AD0C08C9AD0C0C09AD0C0B7 +:109B7000DC9AD0C0FEFFFFFFF49AD0C0249BD0C077 +:109B8000549BD0C0FFFFFFFFF49AD0C0249BD0C0ED +:109B9000549BD0C0FFFFFFFF293DD0C00000000054 +:109BA0000000000000000000989BD0C0FFFFFFFFF6 +:109BB0004894D0C0DB95D0C0A82000209986D0C0A2 +:109BC000B09BD0C0A89BD0C000000000373DD0C0E3 +:109BD000000000000000000000000000CC9BD0C08E +:109BE000FFFFFFFF2093D0C05D95D0C0A985D0C0F6 +:109BF000E49BD0C0DC9BD0C000000000BC9BD0C068 +:109C0000EC9BD0C0FFFFFFFF453DD0C0000000002F +:109C10000000000000000000089CD0C0FFFFFFFF14 +:109C20004894D0C0E995D0C0F095D0C09986D0C0F6 +:109C3000209CD0C0189CD0C000000000533DD0C074 +:109C40000000000000000000000000003C9CD0C0AC +:109C5000FFFFFFFF2093D0C05D95D0C0A985D0C085 +:109C6000549CD0C04C9CD0C0000000002C9CD0C0A4 +:109C70005C9CD0C0FFFFFFFFB093D0C0FC95D0C06C +:109C80000C96D0C09986D0C0789CD0C0000000004F +:109C9000000000001796D0C000180020C984D0C072 +:109CA000949CD0C00000000000000000613DD0C0C6 +:109CB000000000000000000000000000AC9CD0C0CC +:109CC000FFFFFFFF2093D0C0A695D0C0B795D0C0AE +:109CD0009986D0C0C49CD0C0BC9CD0C000000000FD +:109CE0006F3DD0C000000000000000000000000038 +:109CF000E09CD0C0FFFFFFFF4894D0C0D395D0C0F8 +:109D0000A985D0C0F89CD0C0F09CD0C00000000055 +:109D1000849CD0C09C9CD0C0D09CD0C0009DD0C0A2 +:109D2000FFFFFFFFB093D0C02396D0C00C96D0C0E9 +:109D30009986D0C0249DD0C0000000000000000023 +:109D40003196D0C000180020C984D0C0409DD0C03A +:109D500000000000000000007D3DD0C000000000B9 +:109D60000000000000000000589DD0C0FFFFFFFF72 +:109D70002093D0C0A695D0C0B795D0C09986D0C04A +:109D8000709DD0C0689DD0C0000000008D3DD0C047 +:109D90000000000000000000000000008C9DD0C00A +:109DA000FFFFFFFF4894D0C0D395D0C0A985D0C095 +:109DB000A49DD0C09C9DD0C000000000309DD0C0AC +:109DC000489DD0C07C9DD0C0AC9DD0C0FFFFFFFFA0 +:109DD0008094D0C03B96D0C0A985D0C0D09DD0C0C3 +:109DE00000000000000000004D96D0C05496D0C086 +:109DF0001581D0C0E89DD0C0000000000000000028 +:109E00006196D0C07096D0C01581D0C0009ED0C0E1 +:109E100000000000000000009D3DD0C000000000D8 +:109E20000000000000000000189ED0C0FFFFFFFFF0 +:109E30002093D0C01595D0C0A985D0C0309ED0C089 +:109E4000289ED0C000000000AB3DD0C00000000044 +:109E50000000000000000000489ED0C0FFFFFFFF90 +:109E60004894D0C08096D0C0A985D0C0609ED0C094 +:109E7000589ED0C000000000D89DD0C0F09DD0C03A +:109E8000089ED0C0389ED0C0689ED0C0FFFFFFFFA4 +:109E90004F505F52455455524E000000556E646558 +:109EA0006C6567617465000000000000B00100008F +:109EB00000B0A7000000B00200000030313233349F +:109EC0003536373839616263646566303132333430 +:109ED00035363738394142434445466F0090016773 +:109EE000006985F1D00000000042544300900090CA +:109EF00000006A805532465F56329000010990009A +:109F00006E006D00FFFFFFFF00000000092111013E +:109F1000210122220000000009211101000122225A +:109F20000006D0F10901A1010903150026FF007503 +:109F300008954081080904150026FF007508954022 +:109F40009108C006A0FF0901A1010903150026FF21 +:109F5000007508954081080904150026FF00750862 +:109F600095409108C0050F3900021810050038B659 +:109F70000834A909A0478BFDA0768815B6650001B5 +:109F80001E001C100500DF60DDD88945C74C9CD23F +:109F9000659D9E648A9F00000306B2007700000062 +:109FA000297AD0C0397AD0C0497AD0C0597AD0C085 +:109FB000697AD0C0797AD0C0897AD0C0997AD0C075 +:109FC00012034D00530046005400310030003000B1 +:109FD00077002800000000010400010000000000DC +:109FE0000000020157494E55534200000000000096 +:109FF00000000000000000000000920000000001CE +:10A000000500010088000000070000002A0044004D +:10A010006500760069006300650049006E00740009 +:10A02000650072006600610063006500470055002E +:10A030004900440073000000500000007B00310024 +:10A0400033006400360033003400300030002D004F +:10A0500032004300390037002D003000300030005E +:10A0600034002D0030003000300030002D0034006E +:10A070006300360035003600340036003700360005 +:10A080003500370032007D00000000000A000000AB +:10A0900000000306B200080001000000A80008004C +:10A0A00002000200A0001400030057494E5553421D +:10A0B0000000000000000000000084000400070011 +:10A0C0002A004400650076006900630065004900CD +:10A0D0006E00740065007200660061006300650038 +:10A0E00047005500490044007300000050007B0009 +:10A0F000430045003800300039003200360034009B +:10A100002D0034004200320034002D0034004500A0 +:10A11000380031002D0041003800420032002D008F +:10A120003500370045004400300031004400350060 +:10A1300038003000450031007D00000000000000C4 +:10A14000D577D0C00778D0C03D77D0C000000000E0 +:10A15000000000002D79D0C04579D0C0000000007B +:10A160000000000000000000F57BD0C0F57BD0C0EF +:10A17000F57BD0C0057CD0C0B578D0C00778D0C002 +:10A180003D77D0C00000000000000000E978D0C09A +:10A190000179D0C0000000000000000000000000B5 +:10A1A000F57BD0C0F57BD0C0F57BD0C0057CD0C09E +:10A1B0009179D0C0BD79D0C0C179D0C00000000075 +:10A1C00000000000C579D0C0DD79D0C000000000DB +:10A1D0000000000000000000F57BD0C0F57BD0C07F +:10A1E000F57BD0C0057CD0C01201100200000040F9 +:10A1F000972C0100010201020301040309040E036C +:10A200004C00650064006700650072000E034E009C +:10A2100061006E006F00200053000A033000300020 +:10A220003000310009026000030102C0320904005D +:10A23000000203000002092111010001222200078F +:10A2400005820340000107050203400001090401E3 +:10A25000000203010102092111012101222200074C +:10A2600005810340000107050103400001090402C4 +:10A270000002FFFFFF0207058303400001070503FB +:10A28000034000010A060002000000400100000037 +:10A29000030000000000800020000000010000001A +:10A2A00000000000FFFFFF000000000000000000B1 +:10A2B000050102000C00040007000000000000007F +:10A2C000FFFFFF000000000000000000D093D0C09E +:10A2D00005027A000C0004000700000000000000E6 +:10A2E000FFFFFF000000000000000000F093D0C05E +:10A2F000071000000C00800020000000000000009B +:10A30000FFFFFF00000000000880000000000000C8 +:10A31000071100001A00800020000000000000006B +:10A32000FFFFFF00000000000880000000000000A8 +:10A330000300000000008000200000000100000079 +:10A3400000000000FFFFFF00000000000000000010 +:10A35000050100000E0007000400000000000000DE +:10A36000FFFFFF0000000000000000001094D0C0BC +:10A37000050278000E000700040000000000000045 +:10A38000FFFFFF0000000000000000007893D0C035 +:10A390000711000003008000200000000000000002 +:10A3A000FFFFFF00000000000A8000000000000026 +:10A3B00007120000130080002000000000000000D1 +:10A3C000FFFFFF0000000000088000000000000008 +:10A3D00007130000230080002000000000000000A0 +:10A3E000FFFFFF00000000000A80000000000000E6 +:10A3F0002573202825642F2564290025642F2564D2 +:10A4000000252E2A730000000300000000008000D9 +:10A41000200000000100000000000000FFFFFF001E +:10A420000000000000000000050102000C00040014 +:10A430000700000000000000FFFFFF000000000018 +:10A4400000000000D093D0C005027A000C00040088 +:10A450000700000000000000FFFFFF0000000000F8 +:10A4600000000000F093D0C005103800020010007A +:10A470001000000000000000FFFFFF0000000000CF +:10A480000A80000000000000071100001C0080008E +:10A490002000000000000000FFFFFF00000000009F +:10A4A00008800000000000000300000000008000A1 +:10A4B000200000000100000000000000FFFFFF007E +:10A4C0000000000000000000050102000C00040074 +:10A4D0000700000000000000FFFFFF000000000078 +:10A4E00000000000D093D0C005027A000C000400E8 +:10A4F0000700000000000000FFFFFF000000000058 +:10A5000000000000F093D0C0050F100008001000FC +:10A510001000000000000000FFFFFF00000000002E +:10A520000000000000000000071029000C0080005F +:10A530002000000000000000FFFFFF0000000000FE +:10A540000800000000000000071129001A00800028 +:10A550002000000000000000FFFFFF0000000000DE +:10A560000800000000000000F587D0C0001E002099 +:10A57000000000000000000068A5D0C0FFFFFFFF42 +:10A5800000000000000000000000000000000000CB +:10A5900000000000000000000000000000000000BB +:10A5A00000000000000000000000000000000000AB +:10A5B000000000000000000000000000000000009B +:04000005C0D0000166 +:00000001FF diff --git a/src/qt/res/ledger/nanos_test_delete.txt b/src/qt/res/ledger/nanos_test_delete.txt index e69de29bb2..7fc22c971d 100644 --- a/src/qt/res/ledger/nanos_test_delete.txt +++ b/src/qt/res/ledger/nanos_test_delete.txt @@ -0,0 +1 @@ +python3 -m ledgerblue.deleteApp --targetId 0x31100004 --appName "Qtum Test" --rootPrivateKey fea057826208738ba33ff0e1ebb8ebf682ab73753afb2d988df03b1b59187d58 diff --git a/src/qt/res/ledger/nanos_test_load.txt b/src/qt/res/ledger/nanos_test_load.txt index e69de29bb2..6a92d8ba70 100644 --- a/src/qt/res/ledger/nanos_test_load.txt +++ b/src/qt/res/ledger/nanos_test_load.txt @@ -0,0 +1 @@ +python3 -m ledgerblue.loadApp --curve secp256k1 --tlv --targetId 0x31100004 --targetVersion="1.6.1" --delete --fileName :/ledger/nanos_stake_app --appName "Qtum Test" --appVersion 1.5.3 --dataSize 64 --icon 010000000000ffffffffffffffffff1ffc0ff847f1a7f247f1a7f247f10ff01fe0fff7ffffffffffff --rootPrivateKey fea057826208738ba33ff0e1ebb8ebf682ab73753afb2d988df03b1b59187d58 --path "" --path "44'/1'" --path "45'/1'" --path "48'/1'" --path "49'/1'" --path "84'/1'" --path "0'/45342'" --path "20698'/3053'/12648430'" --appFlags 0xa50 From 780450872943ad8ff0cad3db952cd2877bb78e5a Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 6 May 2021 09:59:19 +0200 Subject: [PATCH 142/164] Add ledger test app paths --- src/qt/qtumhwitool.cpp | 6 +++--- src/qtum/qtumledger.cpp | 46 ++++++++++++++++++++++++++++++----------- src/qtum/qtumledger.h | 14 ++++++------- 3 files changed, 44 insertions(+), 22 deletions(-) diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 3cf49464a6..37c7bea167 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -614,18 +614,18 @@ bool QtumHwiTool::removeApp(InstallDevice::DeviceType type) QString QtumHwiTool::derivationPathPKH() { - std::string path = QtumLedger::derivationPath((int)OutputType::LEGACY); + std::string path = QtumLedger::instance().derivationPath((int)OutputType::LEGACY); return QString::fromStdString(path); } QString QtumHwiTool::derivationPathP2SH() { - std::string path = QtumLedger::derivationPath((int)OutputType::P2SH_SEGWIT); + std::string path = QtumLedger::instance().derivationPath((int)OutputType::P2SH_SEGWIT); return QString::fromStdString(path); } QString QtumHwiTool::derivationPathBech32() { - std::string path = QtumLedger::derivationPath((int)OutputType::BECH32); + std::string path = QtumLedger::instance().derivationPath((int)OutputType::BECH32); return QString::fromStdString(path); } diff --git a/src/qtum/qtumledger.cpp b/src/qtum/qtumledger.cpp index 69a78346a2..932348339a 100644 --- a/src/qtum/qtumledger.cpp +++ b/src/qtum/qtumledger.cpp @@ -187,6 +187,7 @@ class QtumLedgerPriv if(gArgs.GetChainName() != CBaseChainParams::MAIN) { arguments << "--testnet"; + ledgerMainPath = false; } if(!toolExists) @@ -230,6 +231,7 @@ class QtumLedgerPriv std::string toolPath; std::vector arguments; bool toolExists = false; + bool ledgerMainPath = true; }; QtumLedger::QtumLedger(): @@ -587,18 +589,38 @@ bool QtumLedger::endGetKeyPool(const std::string &, int, const std::string& , bo std::string QtumLedger::derivationPath(int type) { std::string derivPath; - switch (type) { - case (int)OutputType::P2SH_SEGWIT: - derivPath = "m/49'/88'/0'"; - break; - case (int)OutputType::BECH32: - derivPath = "m/84'/88'/0'"; - break; - case (int)OutputType::LEGACY: - derivPath = "m/44'/88'/0'"; - break; - default: - break; + if(d->ledgerMainPath) + { + switch (type) { + case (int)OutputType::P2SH_SEGWIT: + derivPath = "m/49'/88'/0'"; + break; + case (int)OutputType::BECH32: + derivPath = "m/84'/88'/0'"; + break; + case (int)OutputType::LEGACY: + derivPath = "m/44'/88'/0'"; + break; + default: + break; + } } + else + { + switch (type) { + case (int)OutputType::P2SH_SEGWIT: + derivPath = "m/49'/1'/0'"; + break; + case (int)OutputType::BECH32: + derivPath = "m/84'/1'/0'"; + break; + case (int)OutputType::LEGACY: + derivPath = "m/44'/1'/0'"; + break; + default: + break; + } + } + return derivPath; } diff --git a/src/qtum/qtumledger.h b/src/qtum/qtumledger.h index 657e8f5d2a..a764a68dd3 100644 --- a/src/qtum/qtumledger.h +++ b/src/qtum/qtumledger.h @@ -113,18 +113,18 @@ class QtumLedger { */ bool toolExists(); - /** - * @brief instance Get the ledger instance - * @return - */ - static QtumLedger &instance(); - /** * @brief derivationPath Get the default derivation path * @param type Type of output * @return Default derivation path */ - static std::string derivationPath(int type); + std::string derivationPath(int type); + + /** + * @brief instance Get the ledger instance + * @return + */ + static QtumLedger &instance(); private: bool isStarted(); From 1298baa6c54eb8f9bfe64b199dfd5ad571c5a214 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 6 May 2021 14:29:54 +0200 Subject: [PATCH 143/164] Fix ledger app install for Qtum Test and Qtum Stake Test --- src/qt/res/ledger/nanos_stake_test_load.txt | 2 +- src/qt/res/ledger/nanos_test_load.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qt/res/ledger/nanos_stake_test_load.txt b/src/qt/res/ledger/nanos_stake_test_load.txt index 84d05e4871..4f27369b55 100644 --- a/src/qt/res/ledger/nanos_stake_test_load.txt +++ b/src/qt/res/ledger/nanos_stake_test_load.txt @@ -1 +1 @@ -python3 -m ledgerblue.loadApp --curve secp256k1 --tlv --targetId 0x31100004 --targetVersion="1.6.1" --delete --fileName :/ledger/nanos_stake_app --appName "Qtum Stake Test" --appVersion 1.5.3 --dataSize 64 --icon 010000000000ffffffffffffffffff1ffc0ff847f1a7f247f1a7f247f10ff01fe0fff7ffffffffffff --rootPrivateKey fea057826208738ba33ff0e1ebb8ebf682ab73753afb2d988df03b1b59187d58 --path "" --path "44'/1'" --path "45'/1'" --path "48'/1'" --path "49'/1'" --path "84'/1'" --path "0'/45342'" --path "20698'/3053'/12648430'" --appFlags 0xa50 +python3 -m ledgerblue.loadApp --curve secp256k1 --tlv --targetId 0x31100004 --targetVersion="1.6.1" --delete --fileName :/ledger/nanos_stake_test_app --appName "Qtum Stake Test" --appVersion 1.5.3 --dataSize 64 --icon 010000000000ffffffffffffffffff1ffc0ff847f1a7f247f1a7f247f10ff01fe0fff7ffffffffffff --rootPrivateKey fea057826208738ba33ff0e1ebb8ebf682ab73753afb2d988df03b1b59187d58 --path "" --path "44'/1'" --path "45'/1'" --path "48'/1'" --path "49'/1'" --path "84'/1'" --path "0'/45342'" --path "20698'/3053'/12648430'" --appFlags 0xa50 diff --git a/src/qt/res/ledger/nanos_test_load.txt b/src/qt/res/ledger/nanos_test_load.txt index 6a92d8ba70..029b5e97fd 100644 --- a/src/qt/res/ledger/nanos_test_load.txt +++ b/src/qt/res/ledger/nanos_test_load.txt @@ -1 +1 @@ -python3 -m ledgerblue.loadApp --curve secp256k1 --tlv --targetId 0x31100004 --targetVersion="1.6.1" --delete --fileName :/ledger/nanos_stake_app --appName "Qtum Test" --appVersion 1.5.3 --dataSize 64 --icon 010000000000ffffffffffffffffff1ffc0ff847f1a7f247f1a7f247f10ff01fe0fff7ffffffffffff --rootPrivateKey fea057826208738ba33ff0e1ebb8ebf682ab73753afb2d988df03b1b59187d58 --path "" --path "44'/1'" --path "45'/1'" --path "48'/1'" --path "49'/1'" --path "84'/1'" --path "0'/45342'" --path "20698'/3053'/12648430'" --appFlags 0xa50 +python3 -m ledgerblue.loadApp --curve secp256k1 --tlv --targetId 0x31100004 --targetVersion="1.6.1" --delete --fileName :/ledger/nanos_test_app --appName "Qtum Test" --appVersion 1.5.3 --dataSize 64 --icon 010000000000ffffffffffffffffff1ffc0ff847f1a7f247f1a7f247f10ff01fe0fff7ffffffffffff --rootPrivateKey fea057826208738ba33ff0e1ebb8ebf682ab73753afb2d988df03b1b59187d58 --path "" --path "44'/1'" --path "45'/1'" --path "48'/1'" --path "49'/1'" --path "84'/1'" --path "0'/45342'" --path "20698'/3053'/12648430'" --appFlags 0xa50 From b0bf825570aef7a21419b98688a6e3edf4fdaf8d Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 6 May 2021 16:51:44 +0200 Subject: [PATCH 144/164] Fix default receive address display after hardware wallet creation --- src/qt/receiverequestdialog.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/qt/receiverequestdialog.cpp b/src/qt/receiverequestdialog.cpp index e0d586a25e..73cb438031 100644 --- a/src/qt/receiverequestdialog.cpp +++ b/src/qt/receiverequestdialog.cpp @@ -61,7 +61,13 @@ void ReceiveRequestDialog::setModel(WalletModel *_model) // Enable/disable the receive button if the wallet is now able/unable to give out new addresses. connect(model, &WalletModel::canGetAddressesChanged, [this] { - ui->btnRefreshAddress->setEnabled(model->wallet().canGetAddresses()); + bool canGetAddresses = model->wallet().canGetAddresses(); + bool getDefault = canGetAddresses && !ui->btnRefreshAddress->isEnabled() && ui->labelAddress->text().isEmpty(); + ui->btnRefreshAddress->setEnabled(canGetAddresses); + if(getDefault && getDefaultAddress()) + { + update(); + } }); } From c84a7405f3ca3b8c26457c9e852bede48773e47f Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Tue, 10 Aug 2021 10:56:30 +0200 Subject: [PATCH 145/164] Remove ledger loader from qtum --- src/Makefile.qt.include | 21 +- src/qt/bitcoin.qrc | 14 - src/qt/bitcoingui.cpp | 9 - src/qt/bitcoingui.h | 3 - src/qt/forms/qtumledgerinstallerdialog.ui | 151 - src/qt/qtumhwitool.cpp | 152 - src/qt/qtumhwitool.h | 70 - src/qt/qtumledgerinstallerdialog.cpp | 142 - src/qt/qtumledgerinstallerdialog.h | 36 - src/qt/res/ledger/nanos_app.hex | 2743 ----------------- src/qt/res/ledger/nanos_delete.txt | 1 - src/qt/res/ledger/nanos_load.txt | 1 - src/qt/res/ledger/nanos_stake_app.hex | 2531 --------------- src/qt/res/ledger/nanos_stake_delete.txt | 1 - src/qt/res/ledger/nanos_stake_load.txt | 1 - src/qt/res/ledger/nanos_stake_test_app.hex | 2531 --------------- src/qt/res/ledger/nanos_stake_test_delete.txt | 1 - src/qt/res/ledger/nanos_stake_test_load.txt | 1 - src/qt/res/ledger/nanos_test_app.hex | 2655 ---------------- src/qt/res/ledger/nanos_test_delete.txt | 1 - src/qt/res/ledger/nanos_test_load.txt | 1 - src/qt/walletframe.cpp | 7 - src/qt/walletframe.h | 2 - src/qt/walletview.cpp | 7 - src/qt/walletview.h | 2 - 25 files changed, 2 insertions(+), 11082 deletions(-) delete mode 100644 src/qt/forms/qtumledgerinstallerdialog.ui delete mode 100644 src/qt/qtumledgerinstallerdialog.cpp delete mode 100644 src/qt/qtumledgerinstallerdialog.h delete mode 100644 src/qt/res/ledger/nanos_app.hex delete mode 100644 src/qt/res/ledger/nanos_delete.txt delete mode 100644 src/qt/res/ledger/nanos_load.txt delete mode 100755 src/qt/res/ledger/nanos_stake_app.hex delete mode 100644 src/qt/res/ledger/nanos_stake_delete.txt delete mode 100644 src/qt/res/ledger/nanos_stake_load.txt delete mode 100755 src/qt/res/ledger/nanos_stake_test_app.hex delete mode 100644 src/qt/res/ledger/nanos_stake_test_delete.txt delete mode 100644 src/qt/res/ledger/nanos_stake_test_load.txt delete mode 100644 src/qt/res/ledger/nanos_test_app.hex delete mode 100644 src/qt/res/ledger/nanos_test_delete.txt delete mode 100644 src/qt/res/ledger/nanos_test_load.txt diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index fe4872df94..a411b6bd62 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -37,7 +37,6 @@ QT_FORMS_UI = \ qt/forms/optionsdialog.ui \ qt/forms/overviewpage.ui \ qt/forms/qrctoken.ui \ - qt/forms/qtumledgerinstallerdialog.ui \ qt/forms/receivecoinsdialog.ui \ qt/forms/receiverequestdialog.ui \ qt/forms/receivetokenpage.ui \ @@ -116,7 +115,6 @@ QT_MOC_CPP = \ qt/moc_paymentserver.cpp \ qt/moc_qrimagewidget.cpp \ qt/moc_qrctoken.cpp \ - qt/moc_qtumledgerinstallerdialog.cpp \ qt/moc_qswitchcontrol.cpp \ qt/moc_qvalidatedlineedit.cpp \ qt/moc_qvalidatedtextedit.cpp \ @@ -254,7 +252,6 @@ BITCOIN_QT_H = \ qt/platformstyle.h \ qt/qrimagewidget.h \ qt/qrctoken.h \ - qt/qtumledgerinstallerdialog.h \ qt/qswitchcontrol.h \ qt/qvalidatedlineedit.h \ qt/qvalidatedtextedit.h \ @@ -473,7 +470,6 @@ BITCOIN_QT_WALLET_CPP = \ qt/overviewpage.cpp \ qt/paymentserver.cpp \ qt/qrctoken.cpp \ - qt/qtumledgerinstallerdialog.cpp \ qt/qrimagewidget.cpp \ qt/receivecoinsdialog.cpp \ qt/receiverequestdialog.cpp \ @@ -643,19 +639,6 @@ qt/res/styles/theme3/app-icons/down_arrow_unit.png \ qt/res/styles/theme3/app-icons/splash_bg.png \ qt/res/styles/theme3/app-icons/bg.png -RES_LEDGER = qt/res/ledger/nanos_app.hex \ -qt/res/ledger/nanos_load.txt \ -qt/res/ledger/nanos_delete.txt \ -qt/res/ledger/nanos_stake_app.hex \ -qt/res/ledger/nanos_stake_load.txt \ -qt/res/ledger/nanos_stake_delete.txt \ -qt/res/ledger/nanos_test_app.hex \ -qt/res/ledger/nanos_test_load.txt \ -qt/res/ledger/nanos_test_delete.txt \ -qt/res/ledger/nanos_stake_test_app.hex \ -qt/res/ledger/nanos_stake_test_load.txt \ -qt/res/ledger/nanos_stake_test_delete.txt - BITCOIN_RC = qt/res/bitcoin-qt-res.rc BITCOIN_QT_INCLUDES = -DQT_NO_KEYWORDS @@ -666,7 +649,7 @@ qt_libbitcoinqt_a_CXXFLAGS = $(AM_CXXFLAGS) $(QT_PIE_FLAGS) qt_libbitcoinqt_a_OBJCXXFLAGS = $(AM_OBJCXXFLAGS) $(QT_PIE_FLAGS) qt_libbitcoinqt_a_SOURCES = $(BITCOIN_QT_CPP) $(BITCOIN_QT_H) $(QT_FORMS_UI) \ - $(QT_QRC) $(QT_QRC_LOCALE) $(QT_TS) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) $(RES_TOKENS) $(RES_STYLES) $(RES_LEDGER) + $(QT_QRC) $(QT_QRC_LOCALE) $(QT_TS) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) $(RES_TOKENS) $(RES_STYLES) if TARGET_DARWIN qt_libbitcoinqt_a_SOURCES += $(BITCOIN_MM) endif @@ -723,7 +706,7 @@ $(QT_QRC_LOCALE_CPP): $(QT_QRC_LOCALE) $(QT_QM) $(SED) -e '/^\*\*.*Created:/d' -e '/^\*\*.*by:/d' > $@ @rm $(@D)/temp_$( $@ diff --git a/src/qt/bitcoin.qrc b/src/qt/bitcoin.qrc index 480db9ca59..ac8d782abe 100644 --- a/src/qt/bitcoin.qrc +++ b/src/qt/bitcoin.qrc @@ -240,18 +240,4 @@ res/styles/theme3/app-icons/bg.png res/styles/theme3/app-icons/splash_bg.png - - res/ledger/nanos_app.hex - res/ledger/nanos_load.txt - res/ledger/nanos_delete.txt - res/ledger/nanos_stake_app.hex - res/ledger/nanos_stake_load.txt - res/ledger/nanos_stake_delete.txt - res/ledger/nanos_test_app.hex - res/ledger/nanos_test_load.txt - res/ledger/nanos_test_delete.txt - res/ledger/nanos_stake_test_app.hex - res/ledger/nanos_stake_test_load.txt - res/ledger/nanos_stake_test_delete.txt - diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 6538c1162d..acb017a412 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -413,8 +413,6 @@ void BitcoinGUI::createActions() verifyMessageAction->setStatusTip(tr("Verify messages to ensure they were signed with specified Qtum addresses")); signTxHardwareAction = new QAction(tr("Sign with &hardware..."), this); signTxHardwareAction->setStatusTip(tr("Sign transaction with hardware wallet")); - ledgerAction = new QAction(tr("Menage &ledger..."), this); - ledgerAction->setStatusTip(tr("Menage ledger hardware wallet application")); openRPCConsoleAction = new QAction(tr("Node window"), this); openRPCConsoleAction->setStatusTip(tr("Open node debugging and diagnostic console")); @@ -472,7 +470,6 @@ void BitcoinGUI::createActions() connect(usedSendingAddressesAction, &QAction::triggered, walletFrame, &WalletFrame::usedSendingAddresses); connect(usedReceivingAddressesAction, &QAction::triggered, walletFrame, &WalletFrame::usedReceivingAddresses); connect(signTxHardwareAction, &QAction::triggered, [this]{ signTxHardware(); }); - connect(ledgerAction, &QAction::triggered, [this]{ setupLedger(); }); connect(openAction, &QAction::triggered, this, &BitcoinGUI::openClicked); connect(m_open_wallet_menu, &QMenu::aboutToShow, [this] { m_open_wallet_menu->clear(); @@ -545,7 +542,6 @@ void BitcoinGUI::createMenuBar() if(::Params().HasHardwareWalletSupport()) { file->addAction(signTxHardwareAction); - file->addAction(ledgerAction); } file->addSeparator(); } @@ -864,7 +860,6 @@ void BitcoinGUI::setWalletActionsEnabled(bool enabled) superStakerAction->setEnabled(enabled); walletStakeAction->setEnabled(enabled); signTxHardwareAction->setEnabled(enabled); - ledgerAction->setEnabled(enabled); m_close_wallet_action->setEnabled(enabled); } @@ -1053,10 +1048,6 @@ void BitcoinGUI::signTxHardware(const QString& tx) { if (walletFrame) walletFrame->signTxHardware(tx); } -void BitcoinGUI::setupLedger() -{ - if (walletFrame) walletFrame->setupLedger(); -} #endif // ENABLE_WALLET void BitcoinGUI::updateNetworkState() diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h index 525360b6ec..af9734d568 100644 --- a/src/qt/bitcoingui.h +++ b/src/qt/bitcoingui.h @@ -172,7 +172,6 @@ class BitcoinGUI : public QMainWindow QAction* superStakerAction = nullptr; QAction* walletStakeAction = nullptr; QAction* signTxHardwareAction = nullptr; - QAction* ledgerAction = nullptr; QAction* m_create_wallet_action{nullptr}; QAction* m_open_wallet_action{nullptr}; QMenu* m_open_wallet_menu{nullptr}; @@ -322,8 +321,6 @@ public Q_SLOTS: void gotoVerifyMessageTab(QString addr = ""); /** Sign transaction with hardware wallet*/ void signTxHardware(const QString& tx = ""); - /** Setup ledger hardware wallet application*/ - void setupLedger(); /** Show open dialog */ void openClicked(); diff --git a/src/qt/forms/qtumledgerinstallerdialog.ui b/src/qt/forms/qtumledgerinstallerdialog.ui deleted file mode 100644 index 18d953d4cb..0000000000 --- a/src/qt/forms/qtumledgerinstallerdialog.ui +++ /dev/null @@ -1,151 +0,0 @@ - - - QtumLedgerInstallerDialog - - - - 0 - 0 - 662 - 338 - - - - Qtum app ledger installer - - - - 0 - - - 0 - - - 0 - - - - - 12 - - - 30 - - - 30 - - - - - - 75 - true - - - - Install or remove QTUM app from ledger. - - - - - - - 10 - - - - - - 0 - 0 - - - - Select ledger application: - - - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - true - - - - - - - - - - 30 - - - 15 - - - 30 - - - - - Install - - - - - - - Remove - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Cancel - - - - - - - - - - - diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 37c7bea167..77f6eebad9 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -460,158 +460,6 @@ void QtumHwiTool::addError(const QString &error) d->strError += error; } -class InstallDevicePriv -{ -public: - ~InstallDevicePriv() - { - for(QString path : filePaths) - { - QFile::remove(path); - } - } - - InstallDevice::DeviceType type = InstallDevice::WalletNanoS; - QStringList filePaths; -}; - -InstallDevice::InstallDevice(InstallDevice::DeviceType type) -{ - d = new InstallDevicePriv(); - d->type = type; -} - -InstallDevice::~InstallDevice() -{ - delete d; -} - -QString InstallDevice::deviceToString(InstallDevice::DeviceType type) -{ - bool mainnet = gArgs.GetChainName() == CBaseChainParams::MAIN; - switch (type) { - case InstallDevice::WalletNanoS: - return mainnet ? "nanos" : "nanos_test"; - case InstallDevice::StakeNanoS: - return mainnet ? "nanos_stake" : "nanos_stake_test"; - default: - break; - } - - return ""; -} - -bool InstallDevice::loadCommand(QString &program, QStringList &arguments) -{ - QString rcPath = LOAD_FORMAT.arg(deviceToString(d->type)); - return getRCCommand(rcPath, program, arguments); -} - -bool InstallDevice::deleteCommand(QString &program, QStringList &arguments) -{ - QString rcPath = DELETE_FORMAT.arg(deviceToString(d->type)); - return getRCCommand(rcPath, program, arguments); -} - -bool InstallDevice::getRCCommand(const QString &rcPath, QString &program, QStringList &arguments) -{ - // Get the command - QString command; - QFile file(rcPath); - if(file.open(QIODevice::ReadOnly)) - { - command = file.readAll().trimmed(); - } - else - { - return false; - } - - // Split to params - arguments.clear(); - QStringList args = command.split(" "); - for(QString arg: args) - { - arguments.push_back(parse(arg)); - } - bool ret = arguments.count() > 1; - if(ret) - { - program = arguments[0]; - arguments.removeAt(0); - } - - return ret; -} - -QString InstallDevice::parse(QString arg) -{ - arg = arg.replace(" ", " "); - arg = arg.remove("\""); - if(arg.startsWith(RC_PATH_FORMAT)) - { - QString dataDir = QString::fromStdString(GetDataDir().string()); - QFile fileIn(arg); - if(fileIn.open(QIODevice::ReadOnly)) - { - QByteArray data = fileIn.readAll(); - arg = arg.replace(RC_PATH_FORMAT, dataDir); - arg += ".hex"; - QFile fileOut(arg); - if(fileOut.open(QIODevice::WriteOnly)) - { - fileOut.write(data); - } - d->filePaths << arg; - } - } - return arg; -} - -bool QtumHwiTool::installApp(InstallDevice::DeviceType type) -{ - // Install Qtum App to ledger - InstallDevice device(type); - QString program; - QStringList arguments; - bool ret = device.loadCommand(program, arguments); - if(ret) - { - LOCK(cs_ledger); - d->process.start(program, arguments); - d->fStarted = true; - - wait(); - - ret &= QProcess::NormalExit == d->process.exitStatus(); - ret &= d->strError.isEmpty(); - } - - return ret; -} - -bool QtumHwiTool::removeApp(InstallDevice::DeviceType type) -{ - // Remove Qtum App from ledger - InstallDevice device(type); - QString program; - QStringList arguments; - bool ret = device.deleteCommand(program, arguments); - if(ret) - { - LOCK(cs_ledger); - d->process.start(program, arguments); - d->fStarted = true; - - wait(); - - ret &= QProcess::NormalExit == d->process.exitStatus(); - ret &= d->strError.isEmpty(); - } - - return ret; -} - QString QtumHwiTool::derivationPathPKH() { std::string path = QtumLedger::instance().derivationPath((int)OutputType::LEGACY); diff --git a/src/qt/qtumhwitool.h b/src/qt/qtumhwitool.h index db250a8565..c3d29d6da4 100644 --- a/src/qt/qtumhwitool.h +++ b/src/qt/qtumhwitool.h @@ -50,62 +50,6 @@ class HWDevice QString code; }; -/** - * @brief The InstallDevice class Install Qtum app to device - */ -class InstallDevice -{ -public: - /** - * @brief The DeviceType enum Supported device type to install - */ - enum DeviceType - { - WalletNanoS, - StakeNanoS - }; - - /** - * @brief InstallDevice Constructor - */ - InstallDevice(InstallDevice::DeviceType type = InstallDevice::WalletNanoS); - - /** - * @brief ~InstallDevice Destructor - */ - ~InstallDevice(); - - /** - * @brief deviceToString Device type to string - * @param type Device type - * @return String result - */ - static QString deviceToString(InstallDevice::DeviceType type); - - /** - * @brief loadCommand Get the load command - * @param program Program to start - * @param arguments Program arguments - * @return Success of the operation - */ - bool loadCommand(QString &program, QStringList &arguments); - - /** - * @brief deleteCommand Get the delete command - * @param program Program to start - * @param arguments Program arguments - * @return Success of the operation - */ - bool deleteCommand(QString &program, QStringList &arguments); - -private: - bool getRCCommand(const QString &rcPath, QString &program, QStringList &arguments); - QString parse(QString arg); - -private: - InstallDevicePriv *d; -}; - /** * @brief The QtumHwiTool class Communicate with the Qtum Hardware Wallet Interface Tool */ @@ -260,20 +204,6 @@ class QtumHwiTool : public QObject */ bool decodePsbt(const QString& psbt, QString& decoded); - /** - * @brief installApp Install Qtum App to ledger - * @param type Ledger device type - * @return success of the operation - */ - bool installApp(InstallDevice::DeviceType type); - - /** - * @brief removeApp Remove Qtum App to ledger - * @param type Ledger device type - * @return success of the operation - */ - bool removeApp(InstallDevice::DeviceType type); - /** * @brief errorMessage Get the last error message * @return Last error message diff --git a/src/qt/qtumledgerinstallerdialog.cpp b/src/qt/qtumledgerinstallerdialog.cpp deleted file mode 100644 index b1450950e9..0000000000 --- a/src/qt/qtumledgerinstallerdialog.cpp +++ /dev/null @@ -1,142 +0,0 @@ -#include -#include -#include - -#include -#include - -class QtumLedgerInstallerDialogPriv -{ -public: - QtumLedgerInstallerDialogPriv(QObject *parent) - { - tool = new QtumHwiTool(parent); - } - - QtumHwiTool* tool = 0; - bool ret = false; -}; - -QtumLedgerInstallerDialog::QtumLedgerInstallerDialog(QWidget *parent) : - QDialog(parent), - ui(new Ui::QtumLedgerInstallerDialog) -{ - ui->setupUi(this); - d = new QtumLedgerInstallerDialogPriv(this); - - ui->cbLedgerApp->addItem(tr("Qtum Wallet Nano S"), InstallDevice::WalletNanoS); - ui->cbLedgerApp->addItem(tr("Qtum Stake Nano S"), InstallDevice::StakeNanoS); - - ui->labelApp->setStyleSheet("QLabel { color: red; }"); -} - -QtumLedgerInstallerDialog::~QtumLedgerInstallerDialog() -{ - delete ui; - delete d; -} - -void QtumLedgerInstallerDialog::on_addButton_clicked() -{ - // Install Qtum app from ledger - WaitMessageBox dlg(tr("Ledger Status"), tr("Confirm Qtum install on your Ledger device..."), [this]() { - d->ret = d->tool->installApp(getDeviceType()); - }, this); - - dlg.exec(); - - QString message; - if(!d->ret && parseErrorMessage(message)) - { - QMessageBox::warning(this, tr("Install problem"), message); - } - else - { - QDialog::accept(); - } -} - -void QtumLedgerInstallerDialog::on_removeButton_clicked() -{ - // Remove Qtum app from ledger - WaitMessageBox dlg(tr("Ledger Status"), tr("Confirm Qtum removal on your Ledger device..."), [this]() { - d->ret = d->tool->removeApp(getDeviceType()); - }, this); - - dlg.exec(); - - QString message; - if(!d->ret && parseErrorMessage(message)) - { - QMessageBox::warning(this, tr("Remove problem"), message); - } - else - { - QDialog::accept(); - } -} - -void QtumLedgerInstallerDialog::on_cancelButton_clicked() -{ - QDialog::reject(); -} - -InstallDevice::DeviceType QtumLedgerInstallerDialog::getDeviceType() -{ - int deviceType = ui->cbLedgerApp->currentData().toInt(); - switch (deviceType) { - case InstallDevice::WalletNanoS: - return InstallDevice::WalletNanoS; - case InstallDevice::StakeNanoS: - return InstallDevice::StakeNanoS; - default: - break; - } - - return InstallDevice::WalletNanoS; -} - -bool QtumLedgerInstallerDialog::parseErrorMessage(QString &message) -{ - QString errorMessage = d->tool->errorMessage(); - if(errorMessage.contains("denied by the user", Qt::CaseInsensitive)) - return false; - - if(errorMessage.contains("ModuleNotFoundError", Qt::CaseInsensitive) && errorMessage.contains("ledgerblue", Qt::CaseInsensitive)) - { - message = tr("Ledger loader not found, you can install it with the command:") + "\npip3 install ledgerblue"; - return true; - } - - if(errorMessage.contains("No dongle found", Qt::CaseInsensitive)) - { - message = tr("Please insert your Ledger. Verify the cable is connected and that no other application is using it."); - return true; - } - - if(errorMessage.contains("verify that the right application is opened", Qt::CaseInsensitive)) - { - message = tr("Please close the Qtum application on your ledger."); - return true; - } - - message = d->tool->errorMessage(); - return true; -} - -void QtumLedgerInstallerDialog::on_cbLedgerApp_currentIndexChanged(int index) -{ - int deviceType = index; - switch (deviceType) { - case InstallDevice::WalletNanoS: - return ui->labelApp->setText(""); - case InstallDevice::StakeNanoS: - return ui->labelApp->setText(tr("When Qtum Stake is installed, please turn off the auto lock:\n" - "Nano S > Settings > Security > Auto-lock > OFF\n" - "\n" - "When Qtum Stake is removed, please turn on the auto lock:\n" - "Nano S > Settings > Security > Auto-lock > 10 minutes\n")); - default: - break; - } -} diff --git a/src/qt/qtumledgerinstallerdialog.h b/src/qt/qtumledgerinstallerdialog.h deleted file mode 100644 index 2c65a8ae52..0000000000 --- a/src/qt/qtumledgerinstallerdialog.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef QTUMLEDGERINSTALLERDIALOG_H -#define QTUMLEDGERINSTALLERDIALOG_H - -#include -#include - -class QtumLedgerInstallerDialogPriv; - -namespace Ui { -class QtumLedgerInstallerDialog; -} - -class QtumLedgerInstallerDialog : public QDialog -{ - Q_OBJECT - -public: - explicit QtumLedgerInstallerDialog(QWidget *parent = nullptr); - ~QtumLedgerInstallerDialog(); - -private Q_SLOTS: - void on_addButton_clicked(); - void on_removeButton_clicked(); - void on_cancelButton_clicked(); - void on_cbLedgerApp_currentIndexChanged(int index); - -protected: - InstallDevice::DeviceType getDeviceType(); - bool parseErrorMessage(QString& message); - -private: - Ui::QtumLedgerInstallerDialog *ui; - QtumLedgerInstallerDialogPriv *d; -}; - -#endif // QTUMLEDGERINSTALLERDIALOG_H diff --git a/src/qt/res/ledger/nanos_app.hex b/src/qt/res/ledger/nanos_app.hex deleted file mode 100644 index 2d3216728f..0000000000 --- a/src/qt/res/ledger/nanos_app.hex +++ /dev/null @@ -1,2743 +0,0 @@ -:02000004C0D06A -:1000000010B5044662B605F05BF8002C0DD0012057 -:1000100000022168814205D1606801280AD1A068E8 -:10002000002803D104F01CFF02E0002004F03CFF94 -:10003000002010BD204604F0B9FFF0B581B00446A1 -:100040000020002A1CD00B780A2B19D89D0001260D -:100050003543954214D82370002B10D00096271DED -:100060004D1C002601210022284602F029FA01C772 -:100070002D1D761C20788642F4D3009800E030468F -:1000800001B0F0BDF0B58FB0012040024A4C00270E -:1000900001902754FF2040000290275203AE3046C3 -:1000A00009F0B6F90546B585A8B2002812D0102887 -:1000B00077D003A887850D9806F026FB02200299C9 -:1000C00060523F486F21017045700121204602F0C7 -:1000D0008BFD58E003A806F017FB0D90208802F076 -:1000E0008AFD2078002802D03448029D2FE0344A4F -:1000F000507813780021354D7D44354E7E446F5C39 -:10010000BB4202D1775CB8420AD0491C0D29F6D314 -:100110006D200002CBB20D210D2B029D01D116E006 -:10012000029D2C487844405C002809D07F20830041 -:10013000672000021279002A09D0E25A052A06D067 -:10014000880025497944085806F024F880471D495D -:1001500060529321C900615C00290CD0019BE15CD5 -:10016000EF220A40E25409210903884203D05D21AD -:10017000154A01235354615B020A114B5A545A1811 -:100180005070881C605306F0B3FA03A9884202D16C -:100190000D9806F0B9FA03A8808D002809D10FB098 -:1001A000F0BD03A887850D9806F0AEFA102004F084 -:1001B000C1FF04F0BFFFC0467C180020AA6F0000FA -:1001C000E01F00200202000000180020E995000056 -:1001D000F2950000D7950000C4950000F0B583B0FB -:1001E00019480026FF243146224604F084FF0120EE -:1001F00001904002154D02902E5464002E535D264E -:100200001348815D0298285C9322D700EA5D002A9A -:1002100006D0002904D020210843019949026854DE -:10022000295B05F0FDFA7F2189006852E85D00280E -:1002300006D00748805D002802D0002006F024FA8E -:10024000FFF720FFDBE7C046E01F00207C180020FE -:1002500000180020F0B581B0304C7C44204605F0F9 -:1002600099FF808802F0C7FC204605F093FF808844 -:10027000C0B2264CFF2845D02948784405F08AFFB3 -:100280008088FF2108423DD0214804680546A088A7 -:10029000204F7870000A3870E088F870000AB87053 -:1002A000207A387109342046009109F017F9024686 -:1002B0007A71B81D214604F008FF2C6820460930E9 -:1002C00009F00CF90546AE1D2734204609F006F961 -:1002D000F1B27854EE1DF0B23D18204609F0FEF858 -:1002E00002462846214604F0F0FE094800682730FF -:1002F00009F0F4F88019C0B200994900064A50523A -:1003000009200403204601B0F0BDC0468569000005 -:10031000181D0020E01F00207C180020A2A800006B -:1003200082A8000010B51148784405F033FF8079A9 -:10033000FF2149000B4A082353520B4930224A70CF -:1003400001228A700523CB7003230B714A710024AC -:100350008C71CB7110401B2242400A7009200003AF -:1003600010BDC0467C180020E01F0020D4A700006C -:1003700070B5194C7C44204605F00CFF808802F0D3 -:100380003AFC204605F006FF8088C0B20F4CFF28DB -:1003900019D01248784405F0FDFE8088FF252842D8 -:1003A00011D06B2004020A4EB07800280BD10C4803 -:1003B000784405F0EFFE80886900064A0123535215 -:1003C000307009200403204670BDC04685690000D6 -:1003D000E01F00207C18002088A7000068A700000C -:1003E0004CA7000010B50720C0430A49097900292D -:1003F00000D00846C4B267200002F82C09D805488E -:10040000214606F035F8FF20400003490C52092030 -:10041000000310BDE01F00207C180020F0B585B05F -:10042000524E3779554D7D44284605F0B3FE8088FD -:1004300002F0E1FB284605F0ADFE8088C0B24C4CCE -:10044000042800D98CE0012529468140162001426C -:1004500000D185E00497B1786B2007020020802945 -:100460001CD000297FD1701D00262946324602F09B -:1004700027F83F21C9003F4A50507D208000165484 -:10048000280215543D20C00016543B4816547B20CA -:10049000800016541675D677344E0420F178002962 -:1004A00061D10499091AFF252A46EE32314FB95419 -:1004B0003018401D1F2109017850012002F060FC16 -:1004C00009200203387D08284CD1049535460026C2 -:1004D0003E757D2080003946385CFB340028274675 -:1004E00041D0202468462F463037076044600846D4 -:1004F0002830012103923246334605F0C7FF082118 -:100500000291284605F0B4FF322028706E702A1D33 -:10051000384621462346264605F0E4FF3F20C0002A -:10052000144C21582846243002F07BF92846283004 -:1005300021461531029A04F0C8FD1148784405F0AF -:1005400029FE69460F604E600830302331462A4646 -:1005500005F0D8FF0498400038212152039F02E0A3 -:10056000274600E01746B8B205B0F0BDE01F0020F6 -:10057000856900007C18002086040000D6A60000D3 -:10058000C0A50000F0B59FB014460E4602AD694606 -:100590000D60012115AF1A463B4602F0C2F908353D -:1005A0004127002E03D1284601F090FD212741224A -:1005B0002046294604F089FD38461FB0F0BD0000F2 -:1005C000F0B59DB0C44E7E44304605F0E3FD85791C -:1005D000BC4CA0780D90304605F0DCFD2927C05DAD -:1005E000012635400B95002500282A460AD0A07820 -:1005F00002282A4606D1B448817901220020072921 -:1006000000D002460C92B548784405F0C3FDC05DA9 -:100610000D9B012B29460DD00C990029294609D1A3 -:100620000028294606D0A84881790020072900D053 -:10063000064631460A910127012B384600D128464B -:100640009321C900A14A515CA14EFE36E2780029EF -:1006500003D0002801D1354630E16B200502A07897 -:10066000022800D92AE1022A11D3032A08D0022A3B -:1006700000D023E197480068406B002807D11DE1B6 -:10068000944800684021405C022800D016E16720B1 -:1006900005022079002800D110E1012B099202D136 -:1006A000601D04F073FB08900C98002809D0607955 -:1006B0008000801DC0B220180121002201F000FF3F -:1006C0001C90874D7D44284605F064FD808802F02B -:1006D00092FA284605F05EFD7D49CD1C8088C0B2A7 -:1006E000042800D9EAE00121079181401620014247 -:1006F00000D1E3E005F08CFFAA28754D00D0DDE0C5 -:10070000651D2846394602F0A5F906904120207063 -:10071000671C14AB28460B993A46FFF733FF099B39 -:100720000546012B14D0032B10D1E9B20EAD38468B -:100730002A4602F07EF800206946086022464332CD -:1007400014213223284603F043F843E0022B34D12E -:100750000EA8142104914170002105910170E9B2A5 -:10076000821C38461F46039202F063F8594800681D -:10077000022F17D1049F406B00282CD005F00AFDF2 -:100780000146684607602746433700223846039BE8 -:1007900005F0C8FD0546E8B201281CD1384608F02E -:1007A0009DFE17E0C08869460860059848602246AB -:1007B00043320EA8162196230AE046480068808836 -:1007C00000216A4603C2E9B22246433296233846E4 -:1007D00002F05EF80546422025540B98002801D10E -:1007E00004206070EFB2E5192846433014A9202296 -:1007F00004F06BFCFF20400039466331334B195243 -:100800000D98012830D0069800282DD00C9800288B -:1008100047D02425585D002808D0194620311CA84F -:10082000042204F071FC294B00283AD000265E55C2 -:10083000184620301CA904221F4604F046FC1C9BCD -:100840002046C8300925274A7A44294605F0CEFAC1 -:10085000D020265407984002395C10220A433A54AB -:1008600004F0C0FA2D0329E00D95322F354625D826 -:100870002046C830433421463A461C4604F025FC45 -:10088000C82000210D9A115407984002215C1022C3 -:100890000A4322540898C0B204F086FA09200503DE -:1008A0000CE0092005030A98002807D007984002A9 -:1008B000195C10220A431A5404F09EFAA8B21DB023 -:1008C000F0BDC046E01F0020342100207C1800202D -:1008D00082690000181D002036A50000F4A4000065 -:1008E00038A40000E08D0000B0B569230021852206 -:1008F000002808D0FF2040000C49085A0C49411834 -:100900000B32002001E010461A468BB2094CE2542B -:10091000FF2252008B1C054DAB52491C89B260541A -:1009200099B2202004F07CFFB0BDC0467C180020A6 -:10093000FEFF0000E01F0020B0B50848084D01216F -:100940002954084800242C52074828180822214618 -:1009500004F0D1FB05482C54B0BDC0467C04000017 -:100960007C1800206E0400007D0400008504000057 -:10097000F0B595B08F20C500BB4F00267E51BB4C13 -:10098000385D022822D0012800D069E1C14D7E5196 -:10099000B748395A002900D14AE1B848385C0122E9 -:1009A000FD281FD27851022139554721090178507D -:1009B000B24838188118AE4C15463A5B521B04F009 -:1009C00084FB385B401B3853012631E1A84C395B6E -:1009D000092900D22CE1A74BF85CFD22FC2812D893 -:1009E00009221FE0FE282FD0FD2800D038E103297E -:1009F00000D21DE1A848395C9F208000385C0002CD -:100A000008430322CEE7904200D029E10B2900D20F -:100A10000EE19948381800210A4601F02DFD954B4A -:100A2000395B0B221018884200D901E103950B9025 -:100A30000020012691493A18525C401C002A0ED130 -:100A400000240728F7D918E0052900D2F0E09248E1 -:100A5000381800210A4601F033FD0522A2E7791873 -:100A600013AC0822204601F052FF85483818014691 -:100A7000224602F0C9F87F4B3446FD18284601F0A3 -:100A800009FE0790284601F019FC05900A952846B2 -:100A900001F04CFC02907B4800684023C05C0022BF -:100AA0001128114609920492089230D17B208100CE -:100AB00006910A9D2846019301F00EFE08902846F3 -:100AC000069901F041FE09902846069901F041FE81 -:100AD000019B01466B480068C05C112817D1099D35 -:100AE00006910A9801F09CFB05990843002802D062 -:100AF0000699019B0BE0284608990843002C01D178 -:100B00000799084300280699019B00D1A8E05D4899 -:100B10000068C05C11280B9A06911DD01D4601206B -:100B20000021079A002A00D0084604430A9801F0E1 -:100B300077FB05990843012C069B02D1002800D1C0 -:100B40008EE050480068415D0124002011290B9A75 -:100B500000D1044604941946089D09980543002DC8 -:100B60000A981CD000291AD00B460499002919466E -:100B700015D100210C9112917B218C000CAA12AB93 -:100B8000214601F021FE395D1298002901D100288B -:100B900066D0002901D0002862D10B9A06990798E7 -:100BA00000283DD13848385C002839D00B46059CD8 -:100BB0000299214304250320002900D00546234340 -:100BC000002B0BD131483918E8B23818294A80185F -:100BD000142204F099FA0B9A002833D03D20C0006B -:100BE000002C1DD0385C00281AD00CAC14220A92BC -:100BF00062700020207025483918A01C04F065FAA6 -:100C000016212046224601F014FEE8B23818194990 -:100C1000401821460A9A04F077FA00280BD00B9A64 -:100C200003983A5001204002395C10220A433A549A -:100C3000304615B0F0BD134800684421405C4007C1 -:100C40000ED50B9A1248395C002909D1012139547B -:100C5000472000013958491E3950002AE8D0A7E63C -:100C6000012004F067FAC0467C1800207C040000D4 -:100C70006E04000082020000830200007A0200007D -:100C80007D040000181D00207602000062020000B2 -:100C900085040000740400007B02000070B59EB063 -:100CA0000C4601AD69460D600126002214AB3146A9 -:100CB00001F037FE0948784405F06CFA083581796F -:100CC0004120314203D1284601F000FA212081B2AF -:100CD0002846224601F0ADFD1EB070BD469E0000C4 -:100CE000F0B59FB0E04A94786B210E021179002C88 -:100CF00004D0FF2C02D0802C00D09CE10A90DB4B6A -:100D0000DB4F3D20C0000990385C0025002806918B -:100D100012D0F85C00280FD150790125FD21FD2863 -:100D20000AD34A1CD5B205220023A84200D01A4695 -:100D30000325884200D015460BAE304608F068FB0C -:100D4000B085CC49084208D00BA8002181851598B0 -:100D500005F0DAFC6F20060249E10BA805F0D4FC8F -:100D60001590387DC44E092800D03DE10221C843CA -:100D7000801CC0B284423FD1787F002800D11FE19F -:100D80004F20C400385D002800D12DE100255822F5 -:100D90000A98294604F0AFF9B3494879002800D1F0 -:100DA0000EE10A9E2336491D2922304604F08DF9B2 -:100DB000B74839183046FFF771FF3D55B248012555 -:100DC0003D5434463046AC4E294601F0F1FD002832 -:100DD00000D1F5E09320C000385C002800D003E18A -:100DE000A848042139546802395C10220A433A5455 -:100DF000204604F00BF8E3E00791F520400008904E -:100E0000385C002813D1E8B206990B1A3446FB3639 -:100E1000002B00DAE8E000216A4611605160924A36 -:100E20001018421D3846283005F030FB2646787FE2 -:100E300000282FD0914C385B069D4119FB367D224E -:100E40009200914200D9CFE038188D494018864968 -:100E5000491D2A4604F039F9385B40193853FFF729 -:100E600087FD002804D001204002385CC006F6D57A -:100E700047200001385800287F4E0BD10120410245 -:100E8000795C1022114205D17E4B0324FC5411439E -:100E9000400239540998385C734A9178002925D06A -:100EA00000280A9C11D120206946486017A80860D4 -:100EB000384694306C494A1D0121069B05F0E6FA3C -:100EC00069490998385C002853D00898385C002894 -:100ED00023D020206946486017A808601720000129 -:100EE0003A1838469430012160233FE000280BD1A6 -:100EF0000021684601604160384694305A4A521DCC -:100F0000069B05F0C3FA584A012058497854FF213E -:100F1000490078520020107052E020220392684667 -:100F20001B2109017C18046042603D4628350121DF -:100F30000491002305932846224605F0A7FA284687 -:100F400005F0C4FA684622460260039B43602846C7 -:100F50000A9C04991D4605F099FA6846456017A950 -:100F6000016038469430404A0499059B05F08EFA9A -:100F70003D49787F002829D04348385C002804D1B7 -:100F800000215822204604F0B6F840480068017954 -:100F900061708079A07020464C30082105F068FA15 -:100FA000FF2040000799395200202F4908704870EF -:100FB000787F002811D0E01C17A9202204F085F8C2 -:100FC000159805F0A1FB0920060334E0FF2040003E -:100FD000079A3A52002048700870E11C17A8202296 -:100FE00001F010FC002829D0159805F08DFBFF209A -:100FF0004400002038533875204D7A5B204839185A -:10100000194804F062F8785B385305F071FB0BA9BE -:10101000884202D1159805F077FB1A48012139540E -:10102000164800243C521B4838180822214604F078 -:1010300062F819483C54B0B21FB0F0BD0898385C53 -:101040007B218900795C014309983A5C0A20002AD7 -:1010500005D0090603D1012008997854002038757D -:1010600009200603D1E7C046E01F002079020000F6 -:101070007C180020FFFF0000856900006E0400005E -:101080007A0200007C04000076020000181D002097 -:10109000620200007D0400008504000070B541205C -:1010A000C000134D2818FFF71BFE0446012046021E -:1010B000A85DC0061AD50F48295C042904D003296D -:1010C00005D103F031FE04E0012129540EE003F0C4 -:1010D000FFFD00280AD1FF20400000212952A85D11 -:1010E000EF220240AA552975D520C401204670BDC3 -:1010F0007C1800207C040000F0B581B009210D03AC -:10110000002800954BD0472007014B4EF0594B4B20 -:10111000F15C022901D1401EF051002828462AD056 -:10112000474830188F21CC0032598118454D735BE8 -:101130009A1A03F0CAFF3059715B081A70530124E0 -:101140006502705DEF2101407155FFF711FC002829 -:1011500002D0705DC006F8D5705DC006009D2846BF -:10116000364B08D503F0B4FD002862D1002030755D -:101170003548FB30314BF15C022917D1F259002A76 -:1011800014D103201F46F05403F0CEFD01240028A3 -:101190004FD10022F2552C48FB3011461DE0264865 -:1011A000002202752549415C27481CE0032915D11E -:1011B00000217177F5214B00F15C7B229200B45C39 -:1011C0000C433D21C900755C03210A22002D04D087 -:1011D000240602D10122F25400223275FF2252006D -:1011E000B25A1A4BD21893B2040A194DEC54FF2686 -:1011F0007400931C104F3B53521C92B2A854009A97 -:10120000904201D103290FD10C48012139540D48D6 -:1012100000243C520F4838180822214603F06BFF87 -:101220000D483C5470003B5A99B2202004F0F8FA63 -:101230000024204601B0F0BD7C1800207C04000092 -:101240007A0200006E04000085690000FEFF0000C5 -:10125000E01F00207D04000085040000F0B585B08B -:10126000704D2F79784C7C44204604F093FF8088A1 -:1012700001F0C1FC204604F08DFF6B4EF21C80880B -:10128000C0B2042800D9C9E004970127394681403B -:101290001620014200D1C1E0A878644A7632802845 -:1012A00008D0002800D0B9E03902614B03245C5417 -:1012B00000211975EC788023052C55D8012C53D0CA -:1012C00000286DD1581CC1B200208C4200D00746C6 -:1012D000A01E02905648407F002803930CD1184668 -:1012E0002A30C0B20090019105F092F90199009A5C -:1012F0009042324600D091E07B2080004C4A134659 -:101300001F54012000228C4201461F4600D0114686 -:10131000029BDBB2042B034600D3134619433D2343 -:10132000DB00F9547877FA83424909684023CB5CA3 -:1013300041497A540326744002265E402643002E1B -:1013400000D01046FF263246EA32B8541A2B12D883 -:1013500001209840394A10420DD0E878052808D07D -:10136000042808D1012005E0802C19D0812CA7D0B9 -:1013700054E002207854324800243C54F5204000C8 -:101380003C54304838181822214603F0B4FEEC369D -:10139000BC554F20C00001213954EC78A878039B3C -:1013A000FF273946EC31224E3D22D2009C4229D003 -:1013B000B25C002A26D0725C002A23D1984221D147 -:1013C00028790A38C0B231281CD86879022819D87F -:1013D000012808D1A879382805D1E879322802D126 -:1013E000287A00280ED09320C000305C00280F4AD5 -:1013F00014D1012070544002315C10220A4332544F -:1014000003F024FDEE370498F0551F200001691DFC -:101410003150022001F0B4FC0920020390B205B063 -:10142000F0BDC046E01F0020826900008A6A00000B -:101430007C180020181D0020860400008001400454 -:10144000870400006202000096980000F0B593B097 -:101450006F4C7C44204604F09DFE808801F0CBFB5D -:10146000204604F097FE8088C0B2604F04283ED822 -:101470000124214681401620014238D05C4E6B2069 -:101480000002B178002902D0F178002930D167201C -:101490000002317907292BD305AD284607F0B8FFA4 -:1014A000A8855449084208D005A8002181850F98D5 -:1014B00005F02AF96F2007020EE005A805F024F9CF -:1014C0000F904D49087D0A2803D1FB3770790B280E -:1014D00011D30F9805F018F947480021017505F060 -:1014E00007F905A9884202D10F9805F00DF9384691 -:1014F00080B213B0F0BD41480818751D2922049030 -:10150000294603F0E2FD707980002043295C281809 -:101510004518681C00222146039200F0D1FF02907A -:101520006E79354D36482E543A48784404F032FEF0 -:101530008079042108420DD1324800684021415C85 -:10154000022902D0816B00294BD0412EC1D1806B82 -:10155000000206432C48285C00281CD111AF3846F5 -:10156000029901F05EF9381D314601F05AF97B20ED -:101570008000285C002804D011A8082100F02EFE6D -:1015800009E068460399016041602846283011AAA5 -:10159000082304F07BFF0021049E304601F05AFA34 -:1015A000002804D00120014600F036F807E0600270 -:1015B000295C10220A432A54304603F037FC93205A -:1015C000C000285C09210F03002888D00F488168DB -:1015D000491C81604268914281DB5D2101224254B5 -:1015E0007DE7012E2646B5D073E7C0468569000029 -:1015F000E01F0020FFFF00007C1800202B020000ED -:101600005E020000181D0020860400000018002063 -:10161000AA960000D2950000F0B5B1B0002818D00D -:1016200003910021684601603648374C201827ABEB -:101630000A4601F076F97B208000205C002810D05B -:101640002020694648601FAA0A60412080002018B7 -:101650000EE0FF2043002C4A0020D052692285264C -:101660003CE02020694648601FAA0A6020462830D6 -:101670000121002304F00AFF04AF384604F026FFDE -:101680002025684645601FAE066001243846214685 -:1016900032462B4604F0FAFE1E48784404F07AFDE8 -:1016A0008079400820406946FF273A4652320A6056 -:1016B000486027A8154C31462A46234601F068FAAF -:1016C00079006278D01C104B58521149595CA2180D -:1016D00091707A21CA430B320026039900290ED15A -:1016E00083B20A4CE254FF225200831C064DAB52D7 -:1016F000401C80B2265499B2202004F091F831B0F9 -:10170000F0BDC0462B0200007C180020E01F002026 -:101710005E02000062940000F0B581B0672006020E -:10172000284D287901282AD1284C7C44204604F0F1 -:1017300031FD808801F05FFA204604F02BFD80889F -:10174000C0B2214FFF2819D02148784404F022FD6F -:101750008088FF21084211D0FE1E04F059FFAA28FC -:101760000DD16C791B48784404F014FD092109035C -:101770008088C0B2844205D10E4600E03E46B0B239 -:1017800001B0F0BD3E46FB36082CF8D80091012090 -:10179000A0408B2149000842F1D00F4D7D442846DE -:1017A00004F0F8FC408801F026FA284604F0F2FC28 -:1017B000408820423E46E2D0204600F08FFC009E4A -:1017C000DDE7C046E01F002085690000D2930000DD -:1017D000B293000096930000609300006D20000219 -:1017E00070470000F0B58BB009AD002106262846F1 -:1017F000324603F080FC0A200A9901432971012432 -:101800002846214601F0F0F902202843214601F044 -:10181000EBF9124F7F44384604F0BCFC801C29468B -:10182000324604F017FE6D4620262846314604F065 -:101830001FFE384604F0AEFC08302946324604F05C -:1018400009FE08AD2C70384604F0A4FC401C294663 -:10185000224604F0FFFD0BB0F0BDC046E892000048 -:10186000F0B581B0017800250091002918D0441C02 -:1018700000270125002620462946324600F020FE9A -:1018800080B2094988420BD00849884207D0241DFC -:101890007F1CF8B2009988423546EAD300E0022561 -:1018A000E8B201B0F0BDC0461DB100001EB100009D -:1018B000F0B59BB0B54A9778802038436B210E0273 -:1018C000802800D034E110790C90D578002F04D115 -:1018D000022D02D3802D00D02AE1D520C401264656 -:1018E000FE3EAA200B9004F093FEAA2800D01FE130 -:1018F0000FAE304607F08CFDB085A549084208D0F0 -:101900000FA800218185199804F0FEFE6F200402C3 -:10191000FDE00FA804F0F8FE1990002F16D09721D3 -:1019200089009C4D695A13225201002900D1ECE034 -:10193000AA5A8A4200D0E8E097482818FFF790FF9B -:10194000002864D000F032F90446E8E0012D2AD8DE -:101950004120C0008F4F381800265822314603F02E -:10196000CAFB8A4B58790B2800D3CDE08B4800681E -:1019700001798B4AB95480798A4978548648381855 -:10198000591D292203F0A1FB8048024650798100AD -:101990000120084312185179002D49D0927909028B -:1019A0001143072245E097218F007A4DE95B13220E -:1019B0005601AA5B0C9BD2188A4200D9A5E00024EC -:1019C0006846046044602846283070494A1D0392E6 -:1019D000214604971F4604F059FD684604604460A0 -:1019E000284694302146039A3B4604F04FFD674A4F -:1019F000A85BC019A85314700499695A80B2814237 -:101A000011D1FF204000022129525470BBE0012077 -:101A10004002295C10220A432A54199804F074FEEB -:101A20000920060384E0FF20400001212952AAE09A -:101A3000062297239B00F9528018002964D0089051 -:101A40001320400135460A903D523E46283738461D -:101A5000069304F03BFD30469430079004F036FDC9 -:101A60004E4E3068093007F039FD11300EAA107063 -:101A7000684605604560012338462946099304F00D -:101A800005FD36680936304607F028FD03466846EE -:101A90000560456038462946324604F0F7FC684642 -:101AA00005604560404A7A4411233E46384629463F -:101AB00004F0ECFC06993748405AFC280F4603D83E -:101AC0000DA90870012307E00DA948700B9A533245 -:101AD0000A70000A8870032330463E460590694626 -:101AE0000D604D600DAA294604F0D0FC0C98FB381F -:101AF0000899401A0EA90870264F0A9AB95AC3B21B -:101B00005818B95B884216D9199804F0FDFD412098 -:101B1000C000204908180021582203F0ECFA04F014 -:101B2000E7FD0FA9884202D1199804F0EDFD264681 -:101B3000B0B21BB0F0BD6846056045602C46134E40 -:101B40000899761805982146324604F09FFC0EADA0 -:101B50002B7868460460446007982146324604F0BA -:101B600095FC0A4E0A9AB85A29784018B85234702F -:101B70000699795A80B28142099901D17470022183 -:101B8000FF204000395209200403C8E7E01F00206D -:101B9000FFFF00007C1800202B020000181D002011 -:101BA000090200000A0200002A7C0000F0B5A3B080 -:101BB000FF204600374F0024BC5305AD284607F0F0 -:101BC00027FCA8853449084207D005A884850F98CA -:101BD00004F09AFD6F20040243E005A804F094FD90 -:101BE0000F90202103916846416004961BAE066069 -:101BF000284F28370125384629463246234604F027 -:101C000045FC384604F062FC68460660039B43606E -:101C100038462946324604F039FC684604601F48BD -:101C20001C49081811AF214622463B4600F079FEB8 -:101C30001C48784404F0AEFA807940082840694690 -:101C400064220A604860164C3846124F3146039AA7 -:101C5000234600F09DFF6078801C0499785209208B -:101C6000040304F045FD05A9884202D10F9804F051 -:101C70004BFD4120C00038180021582203F03BFAE8 -:101C800005A8808D002802D1204623B0F0BD03F0C6 -:101C900051FAC0467C180020FFFF00002B02000014 -:101CA000E01F0020CA8E000070B59320C000094DCF -:101CB000285C002801D0084C09E001204602FFF70B -:101CC000F7FD0446A85DC00601D503F053F8204691 -:101CD00070BDC0467C18002082690000B0B5014686 -:101CE00069228520002902D0FFF760FF020AFF2148 -:101CF0004900074B5C5A074D2A55A21C5A52611CD9 -:101D000089B2685491B2202003F08AFDB0BDC0466C -:101D10007C180020E01F00206D20000270470000AA -:101D2000F0B589B01E4617460A460024E543782AD6 -:101D300000D987E0002A06D00024015D002902D1E5 -:101D4000641C9442F9D30490111B8A2048436421F7 -:101D5000069207F0ABF803465A1C306898423FD908 -:101D600001960295002138460092059303F0C3F9CD -:101D7000059B03940698844226D21946039A049838 -:101D80000792805C491E08911C46395D09020E18B5 -:101D90003D463A273046394607F012F94743F11BD2 -:101DA0002F463955393608998C4201D8732E04D301 -:101DB000611E002C0C46E8DC00E02146079A521C0C -:101DC00006988242059BDAD10021039A029D019E6A -:101DD000785C002806D1481C99420146F8D302E0FD -:101DE00032602FE0084600998918091A336831607B -:101DF0008B4227D3131A002B10DB481E0028059BAB -:101E000019DB134878447C181E46BB5DC35C6355E0 -:101E100033465B1E491E0029F5DC0CE08A420AD2DB -:101E20000A49794414463B5CCB5C3B55401C641C1E -:101E300033689C42F7D3074878440178384603F06A -:101E40005AF90025284609B0F0BDC0467478000054 -:101E5000927800005E780000F0B595B000920F46D1 -:101E600002900AAC2A21204607F096F9022004438A -:101E70000594790001400D220A4303924140881DD8 -:101E800001901325002102980491405C06900021E6 -:101E900007200991401A01210891814006980140CC -:101EA0000791ECB2142C0ED81520021B60000AA971 -:101EB0000E183188C81C042900D808463080521EEC -:101EC000B61C002AF5D160000AA9085AFF34072879 -:101ED00000D82C46E0B2132817D814210D1A400060 -:101EE00005990A180AA90E5A138801210027072B01 -:101EF000084600D8384676000E2737400743C843C7 -:101F00001752921C6D1E1E46EED107980028089AA3 -:101F100000D10246149840000E21014011430AA846 -:101F200001850999491C08292546B1D10499491C04 -:101F300008292546A7D100210B460A460C46009EDB -:101F4000D8B240000AAD285A240603D1002801D196 -:101F50000C4604E0D4B230303055521C01245B1CD6 -:101F6000D8B2039D8542EBD81106019D02D13021E4 -:101F70003170012200242146CEB2B5420D4622D94D -:101F8000361876000AAFBE5B6D1C002E04D1EEB28F -:101F9000019FB742F4D816E02506009F04D1D4B2C1 -:101FA0002E253D55521C0124DDB26D000AAE755B35 -:101FB0003035D6B2BD55521C5B1C491CCDB2019EBA -:101FC000AE423546D8D8D0B215B0F0BD80B581212B -:101FD0008900044A525804490968496CFFF73CFFDC -:101FE00080BDC0467C180020181D0020F0B583B0CD -:101FF0002B4D00262B4A2846314603F07CF8284614 -:10200000314600F0F1FD28482E529320C0002E5496 -:10201000264801242C54264828180822314603F06B -:102020006AF8FF20EC302E5422482E54224878447F -:1020300004F0B0F84078012801D0FFF7D3FB1F4827 -:10204000784404F0A7F84078002807D01C4878446A -:1020500004F0A0F8808800F0CEFD02E0FF2000F040 -:102060003DF81848784404F095F80078002814D119 -:1020700002AD2C7001AE3470134F7F44384604F02B -:1020800089F829303146224604F0E4F9384604F054 -:1020900081F82946224604F0DDF903B0F0BDC046C0 -:1020A0007C1800209C0400006E0400007C040000EA -:1020B0007D04000085040000CE8A0000BC8A000078 -:1020C000AE8A0000988A0000828A00004021415CAC -:1020D00001220A40022111430170704710B582B0FD -:1020E000014601AC204600F07FFD0548784404F02D -:1020F00051F8001D0222214604F0ACF902B010BDD7 -:10210000108A0000F0B58DB00746412080003249AA -:102110000D180C46284604F0D9F9002668460660DA -:10212000466077208000221804232846314604F0B8 -:10213000ADF9684606604660172000012218202489 -:1021400028463146234604F0A1F9684606604660F9 -:102150001920000120490A1828463146234604F078 -:1021600095F90C960B96039708377D2084000CAAEE -:102170000BAB3846214600F0C7F9002828D00B9851 -:102180000C9900266A46166056600B1808332846DC -:102190003146039A04F07AF904AA3846214600F041 -:1021A000DDFA002813D068460660466004AA1A23A8 -:1021B0002846314604F06AF96846066046600823FE -:1021C00028463146039A04F061F9012600E0002612 -:1021D00030460DB0F0BDC0467C180020F0B583B08D -:1021E0000C46054600266846066046604120800091 -:1021F0000A490F181B2000010A18202338463146CF -:1022000004F044F9684606604660384631462A467E -:10221000234604F03BF903B0F0BDC0467C18002013 -:1022200070B504461E4E3068416B002911D01D491F -:1022300079440322204602F067FF012500282CD0B4 -:10224000194979440322204602F05EFF002824D079 -:1022500030684021405C13280CD114497944042291 -:10226000204602F051FF002816D118341049794455 -:1022700028220BE00F4979440422204602F044FF53 -:10228000002809D118340C4979440222204602F072 -:102290003BFF0125002800D00025284670BDC04620 -:1022A000181D002031740000227400000B7400001F -:1022B000FD730000B7730000A9730000B0B50446B9 -:1022C000154800684021405C132810D11349794417 -:1022D0000322204602F018FF00281AD117341049B3 -:1022E00079442722204602F00FFF01250FE00D4917 -:1022F00079440322204602F007FF002809D1173451 -:1023000009497944012520462A4602F0FDFE0028AD -:1023100000D000252846B0BD181D002069730000BC -:102320005A7300004373000034730000B0B50446D4 -:102330000C480068406B002810D00B4979440322F8 -:10234000204602F0E1FE0125002808D00749794423 -:102350000322204602F0D8FE002800D0002528469F -:10236000B0BDC046181D0020257300001673000084 -:10237000F0B586B0FF241470046800278C421AD28E -:102380000B9E002B01D000241C60002E01D00024E5 -:10239000346005684C1B012C0DDB05922A46551C48 -:1023A000056014784E2C5FD804954C2C039704D20A -:1023B0002746049D45E03C4659E000274E2C26D098 -:1023C0004D2C0DD04C2CF4D102943746049C0E1B9E -:1023D0000024012E3E464ADB951C056057782FE00D -:1023E00002940196049C0E1B0024022E15463EDB2F -:1023F000009300231C461F46049AD65CE4B2A64014 -:10240000F7195B1C0834022BF7D1ED1C15E0029480 -:102410000196049C0E1B0024042E154627DB009316 -:10242000002423462746049A165DDBB29E40F71926 -:10243000641C0833042CF7D16D1D0560009B019EC0 -:10244000029C491B002915DB04952546B942039CD3 -:102450000DD3002B01D004991960002E2C4600D01A -:1024600037600168C919016005980470012420468D -:1024700006B0F0BD039CFAE7F0B581B000920722E8 -:10248000D34308240029224600D01A46002900D14F -:102490000C4600252946465D7F273740002D3346F0 -:1024A00000D13B46009F002F00D01E46E3B29E4065 -:1024B00071189C186D1C022DEDD1084601B0F0BDBD -:1024C000F0B581B000920722D3430822002900D042 -:1024D0001A461824002900D10C4600252946465DDD -:1024E0007F273740002D334600D13B46009F002F09 -:1024F00000D01E46E3B29E4071189C186D1C042D3E -:10250000EDD1084601B0F0BDF0B5044600201060E2 -:10251000186000291FD02578FD26FC2D01D8012741 -:1025200010E0032917D3B54215D1601C00242646BC -:102530002546075DF6B2B7407D19641C08360327AF -:10254000022CF6D115601F601068C319012000220B -:102550008B4200D91046F0BDF0B585B01446024656 -:102560000020FD26002B029608D0002300291BD056 -:102570001578B54205D201212B4616E00B460146DF -:1025800013E0032910D3B54219460ED1561C00257D -:102590002F462B46715DFFB2B940CB186D1C083732 -:1025A0000321022DF6D100E01946029DAD1C04AEB8 -:1025B000357055180395D2185518002B17D00026E2 -:1025C00037466846066003A804AA29463346FFF743 -:1025D000CFFE00280AD004A80178781CA14200D0C0 -:1025E00038460399A9420746EBD100E0384605B0CA -:1025F000F0BDF0B585B002920027FD22002B08D077 -:10260000002300291BD00478944205D201212346DF -:1026100016E00B46394613E0032910D394421946BD -:102620000ED1441C00252E462B46615DF6B2B1400A -:10263000CB186D1C08360321022DF6D100E0194697 -:10264000921C04AC227042180392C01845180298DC -:102650000128019716DB002B019F13D00B9C0A9ECB -:1026600000276846046003A804AA29463346FFF7FA -:102670007FFE002806D07F1C0298874202DA03986A -:10268000A842EED1012002998F4200D0019805B0F6 -:10269000F0BD000070B501464A78012300246A2A83 -:1026A000184600D020460B4D2D684026AD5D022D0A -:1026B00000D023461843022D0AD16A2A08D00020F0 -:1026C000002A05D18A78012000216A2A00D0084614 -:1026D00070BDC046181D002080B5C12200F002F870 -:1026E00080BD0000F0B581B015460E460746FFF7E5 -:1026F00097FD0024002804D13846FFF7DFFD0028AD -:1027000002D0204601B0F0BD0E4800684021405C78 -:102710007978022807D16A2905D0002907D1B8782D -:102720006A28EED003E06A29EBD00228E9D0012321 -:10273000384631462A46FFF70FFF00240128E0D132 -:102740000446DEE7181D002080B5C222FFF7CAFF4D -:1027500080BD80B5C422FFF7C5FF80BDF0B585B050 -:10276000144600270497039703AA6B465A6004AAED -:102770001A60022201263346FFF73BFF01283D463F -:1027800000D1054604990029304600D1084605408D -:102790000398142800D03E463540002D11D07620F5 -:1027A0006070192020701422E2707720C6433046F2 -:1027B0002130A070201D02F088FC24366676882027 -:1027C0002076284605B0F0BDF0B583B01D4616460C -:1027D0000024002E13D0002D11D06A4616605560DB -:1027E000032201273B46FFF704FF002807D030688B -:1027F000002804D02868002800D107463C4620461F -:1028000003B0F0BD70B50023002A08D00023521E8B -:1028100094B2055D0E5D6E403343002CF7D1D8B203 -:1028200070BD01700A0A42700A0C8270090EC170F4 -:102830007047F0B5A3B0164603AC202522462B46C0 -:1028400003F050FE0BAF384603F034FE1420694607 -:102850000E6048600121384622462B4603F016FEE2 -:1028600023B0F0BD70B588B014466D4620262A46C8 -:10287000334603F037FE284631462A46334603F0F6 -:1028800031FE04222046294602F01FFC08B070BD2C -:10289000F0B58BB01D4614460346109E022701205A -:1028A000FF2E00D807461198002808D0142038437E -:1028B000C2B202A8194602F008FCFFB20EE0FFB255 -:1028C00002A8C2191846FFF7B4FF300A04D002A8C4 -:1028D0004670310A017001E002A8067014213943E4 -:1028E00002AEF21914323046FFF7BCFF01951821F1 -:1028F000394301AB30462246FFF712FA002803DBCA -:1029000001A800880BB0F0BD012002F013FC002AE2 -:1029100006D0491E8B5C0370521E401C002AF9D160 -:102920007047F0B58DB0174606780B2E3CD201915A -:102930000293002E13D0401C0021182200252B46A4 -:10294000445DD2B29440E3186D1C083A042DF7D1CF -:102950008A0003ACA350491C001DB142EDD103F025 -:10296000FFF868460760212703AD384629463246FE -:102970002B4603F02FFE202238462946029C234690 -:1029800003F0D4FD0198002805D0129921200123DD -:10299000224603F0DBFD03F0E3F803A80021202228 -:1029A00002F0A9FB0DB0F0BD022002F0C3FB000055 -:1029B000F0B58DB0024610780B2843D201260028CE -:1029C0003DD002960191521C0024182500273E4656 -:1029D000D35DEDB2AB409E197F1C083D042FF7D1AB -:1029E000A30003ADEE50641C121D8442EDD10528F6 -:1029F000029E24D10126F207039B53402C2B03D0C7 -:102A0000542B01D0312B1AD110490B681C88002C93 -:102A100006D0049D5540A54202D059888D420ED162 -:102A20006432059991420ADC06990198814206D1E7 -:102A3000074A079B01260021934200D80E463046E4 -:102A40000DB0F0BD022002F075FBC046181D00203D -:102A500050C30000F0B58DB002461F4803681C88C3 -:102A60000120002C33D01078022801D208462EE035 -:102A7000019102930B282CD2521C00251826002706 -:102A80003B46D15DF6B2B140CB187F1C083E042F07 -:102A9000F7D1A90003AE73506D1C121D8542EDD114 -:102AA0000122D307039858402C280299019D04D095 -:102AB000542802D03128284609D1049D5D40A54202 -:102AC000104604D04A88012000219542CED10DB095 -:102AD000F0BD022002F02EFB181D0020F0B585B0DD -:102AE00004920C4602780B2A4CD22021217001213D -:102AF000002A3DD00499891E0191461C0023012122 -:102B000002920393182000221546B35CC0B28340A2 -:102B10005D19521C0838042AF7D1C9B26018049A0A -:102B2000511A0122D2072B469343184A7A4403F0E4 -:102B30005DF927462046049906F068FDC1B2361DAE -:102B4000019A91421BDA002D039B01DB3C4603E016 -:102B500027223C466254401CC1B22F226254411CC1 -:102B6000C8B2002222545B1CD8B2029A9042C8D349 -:102B7000C8B2401E00212154C0B205B0F0BD0320F0 -:102B800002F0D8FA022002F0D5FAC046676B0000C6 -:102B9000F0B587B01C4617460591064602F0E0FFE7 -:102BA0000020069006AD6846C5600C9981604460BF -:102BB00007600D98002801D00A4900E00849032267 -:102BC0003046059B03F0D2FC2878C00703D020785C -:102BD00001210143217002F0C3FF07B0F0BDC046E0 -:102BE00001040000010600000A020A43FF21090255 -:102BF00051400180704780B5FF218143000A814226 -:102C000001D003F01DFC80BDF0B5002307241E4653 -:102C1000155D0F5DF619751905550126FF2D00D8B4 -:102C20001E46671E002C3C46F2D101200021FF2DDC -:102C300000D80846F0BDF0B581B000260724009604 -:102C4000155D0F5D330604D0AF4204D97F1E00230B -:102C500003E0009B01E0FF373346BFB27E1B065501 -:102C60000126AF4200D31E46631E002C1C46E7D14E -:102C7000F0B201B0F0BD000070B582B0044601268C -:102C80003002114D285C30420DD01F2000012A581F -:102C9000002168460160416028462830234603F041 -:102CA000F5FB3002285C80070BD51F2000012A5855 -:102CB000002168460160416094352846234603F0B0 -:102CC000E5FB02B070BDC0467C180020F0B581B0B5 -:102CD000FF26EE36294DA85D002848D01F200701A9 -:102CE000E8590478FC2C05D801252846FFF7C4FFD5 -:102CF000FF2031E0FE2C19D0FD2C3BD10120FFF745 -:102D0000BBFFE859411CE951A95DFF31A955C9B282 -:102D100001292CD941780091847802252846FFF7B3 -:102D2000ABFF240200980443FE2015E00120FFF7CA -:102D3000A3FFE859401CE851A95DFF31A955C9B26C -:102D4000032914D900210A46FFF7BAFB04460425DB -:102D50002846FFF791FFFC2008490A46D159491936 -:102D6000D151915D40189055204601B0F0BD012031 -:102D700002F0E0F9022002F0DDF9C0467C180020E4 -:102D8000F0B5BFB00646EA48784403F003FA857907 -:102D900033AC204606F03CFBA085ED0801273D4002 -:102DA00084B2002C01D000F067FC33A803F0ACFC27 -:102DB0003D90002D199700D119951B951DA8C01D98 -:102DC000189025A8011D169128301790F2481C96DE -:102DD0001A9707466CE2072800D069E23C69002C8C -:102DE00000D163E2FF25EE35785D002801D100F0C7 -:102DF00032FC844200D30446002CE74F01D100F09E -:102E00002AFCE0B2FFF738FF1F20000139580919EA -:102E10003950785D001B78553869001B386147E2EE -:102E20004E783446083CE1B2302901D900F021FC4B -:102E3000B11C1191C9B2884201D200F01AFCD748E6 -:102E4000784403F0A7F9D449149D49596A4656605D -:102E500025AB059313608A1C08302021234603F01C -:102E600051FBCD4840598019811F08220598FFF772 -:102E7000C9FC002800D0FCE3C74D149EA8593D2191 -:102E8000C9006A5C002A0DD03A22825C3223C25407 -:102E9000A859401DA851EA5DF332EA55695C012248 -:102EA00000293DD1811C25AE3046224602F00DF9A5 -:102EB0003078322800D0DCE3B7480546149EAC5980 -:102EC0001698A8512420FFF7D7FE11996018A85131 -:102ED000E85D401AE8552F461DA808221799FFF70C -:102EE00016FD002001460246189E735C7C18257F63 -:102EF0005219D31823770122FF2B00D80246491E0E -:102F00000C460834F1D10125FF2B00D885E0B0E351 -:102F10003D20C000A049085C0022002800D1A8E3A1 -:102F2000139201263046FFF7A7FE9B4D149968586F -:102F3000421C6A50E85DFF30E855C0B2232800D833 -:102F400097E3F5204000285C002826D034022E5557 -:102F50002420FFF791FE00200C942855149C295939 -:102F600024312951E85DDC30E855C0B2072800D88B -:102F70007FE30F20400128180822039202F0A5F8F1 -:102F80000398FFF779FE0C982E54285908302851E1 -:102F9000E85DF830E855139D3FE000216846016088 -:102FA00041601720000128182424234603F06EFAFC -:102FB0002046FFF761FE1498295824312950E85D16 -:102FC000DC30E855C0B2072800D852E31DA808221B -:102FD000FFF79DFC002001460246189B5B5C6E4C8F -:102FE0006418257F5219D3182377FF2B324600D857 -:102FF0000246491E0C460834EFD1FF2B139D00D921 -:1030000037E30820FFF738FE63480146149A8858D2 -:1030100008308850C85DF830C8553D20C0005E4A71 -:10302000105C002802D10120010250541C9E159C06 -:10303000FFF74CFE584F3861022171403D22D2000B -:10304000BB5C2B430B430022002B214600D01146D2 -:1030500000281A9A00D104460C4054401B980028BE -:1030600002D1002C00D104E302203875FF252C4644 -:10307000EE34385D002800D1EDE2396901291A9B50 -:1030800020D11F200601B859007801210022AE2866 -:1030900000D11146199A1143012906D101210022BC -:1030A000AE2800D111465940F9770120FFF7E4FD21 -:1030B000B859401CB851385DFF3038553969491E40 -:1030C00039611C9E002917D04D1EC0B2854200D325 -:1030D0000546002D304F00D1BDE2E8B2FFF7CCFD30 -:1030E0001F200001395849193950385D401B3855A7 -:1030F0003869401B3861DBE0022E1FD13D21C90039 -:10310000795C002916D0F5214900795C002915D099 -:1031100000216846016041600F2040013A1838469E -:103120002830082303F0B2F9EE35785D06E0C0469A -:10313000747D00000121090203227A54C0B20328E1 -:1031400000D896E2F52040003D21C900795C0029B5 -:103150000ED0385C00280BD11F2000013A58002106 -:1031600068460160416038462830042303F08EF938 -:103170000420FFF781FD1F2000013958091D395037 -:10318000385DFC30385501203875B868401EB8608D -:10319000F868401CF8608BE07C180020BC7C0000C4 -:1031A000F5204200B95C3D25E800385C00284FD08E -:1031B00000294DD120266846466025A90991016065 -:1031C000172000013C180B9401210491002308935F -:1031D00020460F92099F3A460E9503F057F9204674 -:1031E00003F074F96846076046602046049D29464E -:1031F0003A46334603F04AF9684646601DAF076019 -:10320000ED4C2834204629463A46089B03F03EF907 -:10321000204603F05BF96846076046602046294671 -:103220003A46334603F032F90B980999324601F0D9 -:103230004CFF19200001E04908183946DE4F32469C -:103240001C9E01F042FF0F98395C0E98C000385C5C -:10325000002822D0002920D0D848385C00280BD183 -:1032600000216846016041601B2000013A18384681 -:103270002830202303F00AF90A20387518E00528C1 -:1032800016D1FF24EE34385D002800D1E3E13D691A -:10329000002D00D01AE7042076E7092139750028AF -:1032A00006D03846283003F011F901E008203875BF -:1032B000397D00E03975C8B2042807DC02286EDDCC -:1032C00003282AD00428F3D1B86836E0062800DDA8 -:1032D000BBE1D4D1FF242546EE35785D002800D12E -:1032E000B9E1032800D8C4E10420FFF7C5FC1F2082 -:1032F0000001E74F3958091D3950785DFC30785589 -:1033000008212042D6D00124250200207855FFF75D -:10331000DDFC7C5538610721CCE7022E00D13FE768 -:10332000FF20EE30385C002800D194E1FFF7CEFC9E -:103330000021B860F9600421397506210028B9D050 -:10334000FF24EE34385D002800D184E1072800D83E -:103350008FE1012ECE4F11D13F20C0003858F968BF -:1033600081420BD11F200001395838461530082200 -:1033700001F0ABFE7D208000012139540820FFF7C9 -:103380007BFC1F200001395808313950385DF83076 -:103390003855FFF79BFC38610520387571E7002828 -:1033A00006D0012802D0022882D15FE6B868E0E0AA -:1033B0000026BE60FE603E61384615300822314668 -:1033C00001F099FE3D462835284603F07FF83C463B -:1033D0009434204603F07AF83D20C000385C002881 -:1033E0003AD0012000023E54F5204000385C00280D -:1033F0002DD0684606604660772080003A18042386 -:103400002846314603F042F86846066046601720B9 -:1034100000013A1807922020069028463146069B64 -:1034200003F034F8684606604660192000013A1837 -:1034300028463146069B03F029F868460660466038 -:10344000602320463146079A03F020F804E0172055 -:103450000001381803F03AF8FF261096EE36B85DF2 -:10346000032800D805E11F20050179597720800045 -:103470001290381804240A90224601F026FE2046B5 -:10348000FFF7FAFB7859001D0D957851B85DFC30B7 -:10349000B8558049795C002917D0C0B2032800D8FC -:1034A000E7E07B4F0D9D79599120C0003818042426 -:1034B000224601F00AFE2046FFF7DEFB7859001D88 -:1034C0007851B85DFC30B8551FE073480068402162 -:1034D000405C16280A9C18D8012181406F4801429F -:1034E00013D0002120460A46FEF7EAFF00280CDA36 -:1034F000002120460A46FEF7E3FF6949884204DBC3 -:103500001099EE316248405CC7E763480068442187 -:10351000415C890718D5007A022806D0042813D107 -:103520005B481299405C01280ED8594CA05D0328D5 -:1035300000D89EE00420FFF79FFB0D996058001D06 -:103540006050A05DFC30A055FFF7C0FB504FB86045 -:103550009321C9001C9E022E524A08D1795C002991 -:1035600005D05168002900D150600021116001216F -:10357000397500281DD03846FF27EE37C05D00287A -:1035800069D00124022E1BD0012E254600D04FE524 -:1035900023286ED92420FFF76FFB1F2000013C4930 -:1035A0000A46115824311150D05DDC30D055012528 -:1035B0003EE5032038757BE67C1800208604000079 -:1035C000012856D91F210A011492314989580A78D5 -:1035D000022A159400D19BE4012A00D120E4002A9C -:1035E00047D13D20C0002A49085C002841D12E4C1B -:1035F0007C44204602F0CEFD8088FFF7FCFA20468E -:1036000002F0C8FD8088C0B2042806D0022804D089 -:1036100001282ED11B9800282BD01D4C149D6059D9 -:10362000401C6051E05D401EE055C0B2232820D907 -:103630002420FFF721FB605924306051E05DDC302D -:10364000E0550120A0770025E7E401460839032969 -:1036500001D3FFF7C0FB03F04BF833A9884202D136 -:103660003D9803F051F833A8808D00280DD13FB06C -:10367000F0BD012001F05EFD33A8002585853D9851 -:1036800003F042F802480575204601F053FDC0469C -:103690007C18002086040000181D002080014000D6 -:1036A00003000080001800200C750000F0B581B008 -:1036B00000900B09012213405B42194C1C40CD08BD -:1036C00015406D42174E2E404701774067404C0928 -:1036D000144064421448204078408E0916407642D7 -:1036E000124F37404740C80910404042104A02403C -:1036F0007A4098272F40009DED0E49012943C9B219 -:10370000794079251D404D40F32121406940AE2389 -:1037100033404B401E2101405940104601B0F0BDDE -:10372000E2996DB7618EBCF2C4B35F3EA8E2AB2EE6 -:1037300070E4434FF0B581B015460E4607463C781D -:10374000012000210090FFF7B1FF002C12D07F1C58 -:103750001F22224042403C781046FFF7A7FF7F1C03 -:10376000002CF5D106E0FFF7A1FF0246307850406B -:103770006D1E761C002DF6D10824FFF797FF641EFE -:10378000FBD1009A504001B0F0BD000070B5144666 -:103790000A4601460D487844FFF7CCFF2322054630 -:1037A000D54020239E1A0B46B3402B431646203E9D -:1037B0000D46F540002E00DA1D461F232B402370D6 -:1037C000531F641C002A1A46E9D170BDA65F000091 -:1037D000F0B599B01D460346002017901690107062 -:1037E00014296FD11E990020002904D0012969D124 -:1037F0000192082000E001920CAF3870781C14226E -:10380000194601F062FC15210026324630463B780D -:1038100000021843134608337F1C491E0224E44368 -:10382000A2420EDB0D3213460A3B0446DC401F2346 -:10383000234002ACA355521F761C092AF3DC521F09 -:1038400000E01A460029E2D1002A019F07D0052195 -:10385000891A88401F21014002A88155761C02A8C0 -:1038600016AA3146FFF792FF0020002E394611D0EC -:1038700002A801780023144A7A44202920D2581C37 -:10388000AB421DD202ACE45C145DFC54B042034672 -:10389000F3D3391800220D4B7B4416AC2478202C2E -:1038A0000ED28418641CAC420AD816ACA45C1C5D11 -:1038B0008C54521C082AF0D300238B54801801E04A -:1038C0000020387019B0F0BDD05E0000B05E00007E -:1038D000F0B58BB00AAC55202070099401206946E0 -:1038E000886009A8486000250D607B487844402125 -:1038F0009F232A4601F042FC002800D1E3E0207813 -:10390000012800D0DFE005F0FFF9284605F070FA45 -:10391000C4266E4F0323BB55C022704979440892D8 -:10392000B9502C46D0206E49794403903950CC21AF -:1039300007917C5066480370446002F075FE0425D0 -:10394000284602F0EDFE6249486001F073FE01F086 -:1039500073FEBE2005903C52284602F0E1FE5C4911 -:103960004860002837D0972835D008983858002864 -:1039700031D00598385AAA24B95D80B288422AD23B -:1039800002F09AFE002826D102F018FEA04203D1D0 -:1039900002F03EFEA0421ED1089838580599795A87 -:1039A0004901401807997958002902D08847002812 -:1039B00009D0012805D1089838580599795A490144 -:1039C000401800F011FB0599785A401C785208996C -:1039D00079580029D0D1BC5D05983D5A4B20810013 -:1039E0003C480022049102F073FE01F0BFFDA542A5 -:1039F00043D2AA240898385800282DD0BE25785BD9 -:103A0000B95D80B2884227D202F056FE002823D149 -:103A100002F0D4FDA04203D102F0FAFDA0421BD176 -:103A200008983858795B4901401807997958002956 -:103A300002D08847002808D0012804D108983858B7 -:103A4000795B4901401800F0CFFA785B401C78534D -:103A5000089979580029D3D1B85D06903546059864 -:103A60003E5A049881B200221A4802F031FE01F059 -:103A70007DFD069886422E46BCD301F08DFC04984D -:103A800084B2144D00222846214602F021FE01F0A6 -:103A900083FC039E00222846214602F019FE01F015 -:103AA00065FD02F009FE002802D0B8590028F1D1C6 -:103AB00005F046F901F0BEFD01F0BEFD054800220B -:103AC000214602F005FE0BB0F0BDC0461C1D0020D3 -:103AD000481F00201C1E002050720000645E000081 -:103AE000B901000004490840884203D1D0200349AD -:103AF00000220A5000207047030000801C1D002097 -:103B000070B594B014460A46014601A8FCF795FA30 -:103B100001460020002912D001A8027800216B463E -:103B20001960011D21250CAE2846334602F052FDD6 -:103B3000202228463146234602F0F8FC012014B02A -:103B400070BDF0B59DB0144613AAFFF7D9FF00254C -:103B5000002811D021266F4613AA01253046394688 -:103B60002B4602F0F3FC08373846FEF7AFFA204642 -:103B70003946324601F0A9FA28461DB0F0BD0000D2 -:103B8000F0B58BB00746119C012F17D0129E032F62 -:103B900012D1212205AF084611463A46FEF749FEEA -:103BA0000025684605601421384622463346FFF753 -:103BB0000FFE002836D136E0022F25D1039304945E -:103BC00005A81425457000240470861C212208468F -:103BD00011463246FEF72DFE022F0DD11099002915 -:103BE00008D06846056000220498334602F09AFB2C -:103BF000002817D1002516E06846039912C005A8D1 -:103C000016219623049D09E025460024684614C029 -:103C10000648301883B22122084611462A46FEF78C -:103C200037FE2C54012528460BB0F0BDFFFF0000E5 -:103C300070B59AB00E4604462069002500282AD0A7 -:103C4000217BA068401CFF31C9B211AA00252B4678 -:103C5000FFF777FF00281ED0F388B288A0680078AD -:103C6000716B33256E46B56004AD22C611A9FFF70E -:103C700087FF002500280ED0246904AD284605F0F2 -:103C80002DFC421C2846214605F09CFA0125002106 -:103C9000002800D00D4628461AB070BDF0B585B09A -:103CA0000A4606460020B07334460E34317B08299C -:103CB00027D803AF002101910825384602922A46F1 -:103CC00001F019FA327BA81A3818B16801F0FDF931 -:103CD000029D2735284605F001FCC6B2204629463C -:103CE000324601F0F2F92020A055A019421C02989A -:103CF000416C3846FEF7B0F8301820180199417031 -:103D0000012005B0F0BD000070B598B004466D46C6 -:103D10006021284605F040FAA16928461C3040225F -:103D200005F03EFC5C20295C0020002917D1227B95 -:103D3000082A14D8267D082E11D86D46A81A1430EA -:103D4000A16805F02FFAA81B1C302169324605F046 -:103D500029FA04486022294605F024FA012018B007 -:103D600070BDC0460018002010B50C490860FEF771 -:103D70003DF99320C0000A4901240C5401F03EFC97 -:103D80002102084805F008FA002004F01DF9204639 -:103D900004F01AF9FCF722FA10BDC046181D0020E5 -:103DA0007C1800201C1D002080B5064800780028E3 -:103DB00001D104F0A9FF044979440020024604F02F -:103DC0000FFB80BD1C1D0020845F000080B582B009 -:103DD00001900648784402F0DDF9293001A901225A -:103DE00002F038FBFFF7E0FF02B080BD286D000055 -:103DF00001460020022903D8880002497944085866 -:103E00007047C0469C5E000080B5012805D00028A0 -:103E100007D10020FFF7DAFF80BD0120FFF7D6FFB2 -:103E200080BD002003497944034A7A4404F066FFC8 -:103E300080BDC0461300000027000000014600209E -:103E4000012903D888000249794408587047C046C0 -:103E50005C5E000080B5002802D0FFF7A5FF80BDA2 -:103E60000648784402F096F92921435C0020044971 -:103E70007944044A7A4404F023FF80BD9A6C000020 -:103E80007DFFFFFF91FFFFFF80B5002003497944CC -:103E9000034A7A4404F032FF80BDC046ABFFFFFF07 -:103EA000BFFFFFFF80B5FF2002F0EEFB80BD80B5B5 -:103EB0000120FDF713FFFFF777FF80BD80B50020DD -:103EC000FDF70CFFFFF770FF80BD80B50120FDF707 -:103ED00013F9002800D080BDFFF766FF80BD80B5D4 -:103EE0000020FDF709F9002800D080BDFFF75CFF36 -:103EF00080BD80B50120FDF7FFF8002800D080BD0F -:103F0000FFF752FF80BD80B50020FDF7F5F80028CF -:103F100000D080BDFFF748FF80BD80B50120FDF7D0 -:103F2000EBF8002800D080BDFFF73EFF80BD80B5D4 -:103F30000020FCF7D9FCFFF737FF80BD80B50120DA -:103F4000FCF7D2FCFFF730FF80BD80B50020FCF706 -:103F5000CBFCFFF729FF80BD80B50120FCF7C4FC36 -:103F6000FFF722FF80BD80B50020FCF7BDFCFFF706 -:103F70001BFF80BD80B50120FCF7B6FCFFF714FFE6 -:103F800080BD80B50020FCF7AFFCFFF70DFF80BDC2 -:103F900080B50020FCF7A8FCFFF706FF80BD80B5C8 -:103FA0000120FCF7A1FCFFF7FFFE80BD80B50020DB -:103FB0000146FDF731FBFFF7F7FE80BD80B501201C -:103FC0000021FDF729FBFFF7EFFE80BD80B5002043 -:103FD000FCF78AFCFFF7E8FE80BD80B50120FCF706 -:103FE00083FCFFF7E1FE80BD80B50178490601D072 -:103FF00001F07CFB80BD0000B0B5054607202840DD -:104000000024012814D0022814D1002909D00B481B -:1040100002F046FB68B200280ADA02F011FA002426 -:1040200006E0FF2152310548002202F051FB044610 -:104030002046B0BD022001F07DF8C046E01F002000 -:10404000F0B581B0E04D28780C2810DD0D286CD03B -:104050000E2800D1C7E015280FD1DC48807901284F -:104060000BD1A879000708D4102001F063F80528C7 -:1040700000D111E10C2800D181E2D54C0027676006 -:1040800001202070204602F0CFFA042002F048FB05 -:104090006060692800D05DE101F0CCFA01F0CCFA53 -:1040A000BE25F84E7753042002F03AFB60600028EA -:1040B00000D164E2972800D161E2C0243059002881 -:1040C00000D15CE2705BAA27C421715C80B2884297 -:1040D00000D354E202F0F0FA002800D04FE202F0E0 -:1040E0006DFAB84204D102F093FAB84200D046E229 -:1040F0003059715B49014018CC217158002902D018 -:10410000884700280AD0012803D13059715B490142 -:1041100040180178490601D001F0E8FA705B401CB4 -:10412000705331590029CFD129E2D54C002767605F -:1041300001202070204602F077FA042002F0F0FA05 -:104140006060002800D11AE2972800D117E26928A0 -:1041500000D099E101F06EFA01F06EFABE25C94E69 -:104160007753042002F0DCFA6060002800D106E2F8 -:10417000972800D103E2C0243059002800D1FEE185 -:10418000705BAA27C421715C80B2884200D3F6E13B -:1041900002F092FA002800D0F1E102F00FFAB842E2 -:1041A00004D102F035FAB84200D0E8E13059715B31 -:1041B00049014018CC217158002902D088470028B5 -:1041C0000AD0012803D13059715B490140180178A8 -:1041D000490601D001F08AFA705B401C70533159D6 -:1041E0000029CFD1CBE1EA4D00276F600120287074 -:1041F000284602F019FA042002F092FA04466C6094 -:10420000692C00D0E6E001F015FA01F015FABE24A1 -:10421000E04E3753042002F083FA6860002800D192 -:10422000ADE1972800D1AAE1C0257059002800D13E -:10423000A5E1305BAA27C421715C80B2884200D31B -:104240009DE102F039FA002800D098E102F0B6F9B9 -:10425000B84204D102F0DCF9B84200D08FE17059C5 -:10426000315B49014018CC217158002902D08847A0 -:1042700000280AD0012803D17059315B4901401848 -:104280000178490601D001F031FA305B401C30530F -:1042900071590029CFD172E1BD4C00276760012020 -:1042A0002070204602F0C0F9042002F039FA606064 -:1042B000002800D163E1972800D160E1692800D08F -:1042C00018E101F0B7F901F0B7F9BE25B14E775307 -:1042D000042002F025FA6060002800D14FE1972801 -:1042E00000D14CE1C0243059002800D147E1705B77 -:1042F000AA27C421715C80B2884200D33FE102F05A -:10430000DBF9002800D03AE102F058F9B84204D1B4 -:1043100002F07EF9B84200D031E13059715B4901B9 -:104320004018CC217158002902D0884700280AD0B3 -:10433000012803D13059715B4901401801784906C1 -:1043400001D001F0D3F9705B401C70533159002942 -:10435000CFD114E1C0258F4C6059002800D106E16F -:10436000BE26A05BAA27C421615C80B2884200D32C -:10437000FDE002F0A1F9002800D0F8E002F01EF9FB -:10438000B84204D102F044F9B84200D0EFE06059DD -:10439000A15B49014018CC216158002902D088470F -:1043A00000280AD0012803D16059A15B49014018B7 -:1043B0000178490601D001F099F9A05B401CA05397 -:1043C00061590029CFD1D2E01C1E002034210020E9 -:1043D000481F0020D8206F4D2958002911D0642291 -:1043E00064290B4600D31346CA1A2A50D421002A46 -:1043F00007D16958002904D0DC22AA582A5000208D -:104400008847002C00D1BAE0972C00D1B7E0C02437 -:10441000285900282FD0BE26A85BAA27C421695C92 -:1044200080B2884227D202F047F9002823D102F057 -:10443000C5F8B84203D102F0EBF8B8421BD12859B5 -:10444000A95B49014018CC216958002902D088474E -:1044500000280AD0012803D12859A95B4901401836 -:104460000178490601D001F041F9A85B401CA8532E -:1044700029590029D2D1C420285CBE21695A7AE08A -:10448000481F00201C1D0020C025424C60590028F8 -:104490006DD0BE26A05BAA27C421615C80B2884291 -:1044A00065D202F009F9002861D102F087F8B8421C -:1044B00003D102F0ADF8B84259D16059A15B49016E -:1044C0004018CC216158002902D0884700280AD022 -:1044D000012803D16059A15B4901401801784906C0 -:1044E00001D001F003F9A05B401CA05361590029E1 -:1044F000D2D13CE0D020274C2058002803D0E978C6 -:10450000490801F037F9C025605900282FD0BE2690 -:10451000A05BAA27C421615C80B2884227D202F046 -:10452000CBF8002823D102F049F8B84203D102F0B9 -:104530006FF8B8421BD16059A15B49014018CC21EA -:104540006158002902D0884700280AD0012803D1E9 -:104550006059A15B490140180178490601D001F07A -:10456000C5F8A05B401CA05361590029D2D1C420DA -:10457000205CBE21615A814201D302F09DF802F015 -:104580009BF8002801D100F007FF012001B0F0BD29 -:10459000481F00201C1D0020B0B582B019481A4DDC -:1045A0002A18294615316846FEF745FB00240028E5 -:1045B00025D1164914316846082204F003FE00286C -:1045C0001DD100206877F5214A003D21C9006B5CB0 -:1045D0000A21002B05D0AB5C002B02D10121A9548C -:1045E0000021092212030A4BEA52FF225200022341 -:1045F000AB522975074990220A7048700124204661 -:1046000002B0B0BD7D0400007C180020001800201E -:1046100002020000E01F0020F0B583B02A4EB07FF8 -:1046200000280BD0294C204655302B4979440722CD -:1046300000F04BFD5C20002121543FE0244832185B -:104640003146153101A8FEF7F6FA224F3D680028E1 -:104650000DD04020285C082833D11C4C2046553012 -:104660001E497944062200F030FD5B3424E02735F2 -:10467000284604F033FF0246144C553420462946A0 -:1046800000F023FD3D682735284604F027FF202150 -:104690002154284604F022FF2018401C8121890063 -:1046A000705001A8FDF792FC05463868273004F0E9 -:1046B00015FF28182018441C00202070012003B08A -:1046C000F0BD0020FBE7C0467C1800200018002049 -:1046D0007D040000181D0020B15500008355000026 -:1046E000F0B5A5B01E4614460F460546FDF7D2FFAD -:1046F000002807D0A74979440A22204604F052FD39 -:1047000025B0F0BD0494A14800684024005D112844 -:1047100044D128463946FEF71CF803909B480068B0 -:10472000005D11283AD128463946FDF7D5FF00280B -:1047300012D07B208000039C002C07D09449085C99 -:10474000002803D0083D2846FDF7DCFC002C049827 -:104750007ED0924979447DE08C480068005D112844 -:104760001CD128463946FDF7EFFF002816D07B20E4 -:1047700080000399002907D08549085C002803D0F0 -:1047800028460838FDF7BEFC2C78FD2C7F4F64D1FD -:104790006878A97809020143C81C5FE02846FDF744 -:1047A000C5FD002810D079480068406B0028A7D0CC -:1047B00001F0F0FC0146A8786A461060EB1C00226C -:1047C000049801F0AFFD9BE7704F3868C488284615 -:1047D000FDF726FD0321002802D0386884880421D3 -:1047E000200A04D005AA54701070022702E005A820 -:1047F0000470012705A8C0196918142503902A46DA -:1048000000F063FCFF20EA306149085C002810D00A -:104810005E480068C28801200021944200D008460A -:104820006946086014210398049A3346FEF7D0FFC6 -:1048300066E7012069460C6048602F43B9B2B3B205 -:1048400005A8049C2246FEF723F80021215457E7CF -:104850005149794404F03AFE52E7601C2918153991 -:1048600020AE1422304604F09DFC307800281CD085 -:10487000002020A94E4A7A440B781C09145D05AD2E -:104880002C542C180F251D40535D6370491C801C4F -:104890002928F1D3282005AB002119544121454A8C -:1048A0007A44049801F0A2FA2AE703200121FD2CA2 -:1048B00000D00846295C4018295C4118039800285C -:1048C0000CD0685C0818401C295C00290AD04C29CF -:1048D00009D1291849784018801C04E068184078EC -:1048E000891C09E0401C291849784018801C295C63 -:1048F0000818401C295C491C08182A5C411C4C2AD9 -:1049000000D001466C186078A17809020143E07874 -:10491000227912020243100408431F901FA8204965 -:104920007944042204F008FE00280DD01FA81E4977 -:104930007944042204F000FE002800D0E0E61B4980 -:1049400079440B220498D9E63D68287919AE307075 -:1049500021461131701C15273A4604F023FCA88823 -:1049600001216A4603C205AD5023304639462A4626 -:10497000FDF78EFF002129544420205C6946086021 -:104980004121084A7A4404982B468BE7181D0020E1 -:104990007C180020EE5C0000AB530000985400002F -:1049A000E752000088520000F7520000B05A0000A1 -:1049B000B65300009D530000F0B597B001AD5024F0 -:1049C0002846214604F0E8FB4548464F391815A80B -:1049D0000822FDF79CFF444838187B2189002A46AD -:1049E0002346FFF77DFE414E40223046294604F023 -:1049F000D7FDA1208000385C142811D13C4838181C -:104A000040497944042200F07FFB002808D139484E -:104A100038183D497944042200F076FB00282FD055 -:104A2000354C374626682736304604F057FD024697 -:104A30003D4641352846314600F047FB266827367B -:104A4000304604F04BFD2021295430463E4604F008 -:104A500045FD2818401C81218900224A505015A884 -:104A6000FDF7B4FA05462068273004F037FD281812 -:104A7000401C3018412100224254012017B0F0BDE3 -:104A80001E48381801210022FDF71AFD0346304662 -:104A900041301F2B06D0032B07D0012B0BD11B4914 -:104AA000794404E01A49794401E01A49794406221C -:104AB00004F078FB04E01421174A7A4401F096F9D7 -:104AC00035464135284604F009FDC4B22819812134 -:104AD000890078500A483818FDF778FA2018C8E796 -:104AE0007A0200007C1800208202000000180020DA -:104AF0008502000089020000181D00208D020000C0 -:104B0000910200004C520000E7590000B351000030 -:104B1000B3510000B3510000AB51000070B58CB030 -:104B200020206946486004AE0E600C4894300C4D5D -:104B30002A46413201240023214601F0A7FC6846A1 -:104B4000082306601836436086604121054A7A448E -:104B5000284601F04BF920460CB070BD7C180020AF -:104B60000018002026510000F0B59BB007A8502186 -:104B700004F012FB4F4F39680020002959D10090F2 -:104B80004E4C0120029038604B482118264605AC57 -:104B90000825204601912A46FDF7B9FE39460C3119 -:104BA00020462A4604F00EFB002841D14448301824 -:104BB0007B21890007AD50232A46FFF791FD394636 -:104BC0001C31284604F03EFC0028344630D13D48D4 -:104BD000205C022808D14720000121584A1E22509B -:104BE00002230121002A30D08F20C500635901988B -:104BF000C118354A1646A25BD21A00F066FA60590F -:104C0000A15B081AA053029E7502605DEF2101406E -:104C10006155FBF7ADFE002804D001204002205C66 -:104C2000C006F6D5605DC00605D538680028A8D056 -:104C300000981BB0F0BD472000012158002000293A -:104C400000D006461F48235C3146022B19D10029AB -:104C500017D003201B4960541C48221821461531E7 -:104C600003A8FDF7E8FF002807D1143703A808229E -:104C7000394604F0A7FA002801D00020D9E71148EE -:104C8000235C0120032BD4D100206077F520410064 -:104C90003D20C000225C0A20002A05D0625C002A68 -:104CA00002D10120605400202075FBF745FE012051 -:104CB000BFE7C046001800207A0200007C180020E0 -:104CC000820200007C0400006E0400007D040000ED -:104CD00010B59320C0000F4C205C002802D0FFF7D5 -:104CE00043FF10BDFFF768FE4720000120580A4926 -:104CF0006158491C0B1A094855301421084A7A4456 -:104D000001F074F8074979440020024603F068FB7B -:104D1000012010BD7C180020740400000018002041 -:104D2000824F0000AA51000010B59320C0000E4C25 -:104D3000205C002802D0FFF72FFC10BDFFF76CFCB1 -:104D40000146002000290ED07B208000205C002836 -:104D500002D00649794401E0054979440020024621 -:104D600003F03EFB012010BD7C18002054520000CF -:104D70003A52000080B5FFF7D1FE03497944002084 -:104D8000024603F02DFB80BD7450000010B50446B0 -:104D900004497A22FDF7A2FE00212046FDF708FE15 -:104DA00010BDC04600180020B0B504460A4DC835F5 -:104DB000284604F093FB202129542918002048702C -:104DC000002C02D00649794401E0044979440246A6 -:104DD00003F006FBB0BDC046E01F002010530000EA -:104DE000F252000080B5034979440020024603F0E6 -:104DF000F7FA80BD6853000080B50349794400206C -:104E0000024603F0EDFA80BDC453000080B50549A9 -:104E10007A22FDF763FE044979440020024603F03C -:104E2000DFFA80BD001800204C54000080B5054911 -:104E30007A22FDF753FE044979440020024603F02C -:104E4000CFFA80BD00180020D854000080B5034977 -:104E500079440020024603F0C3FA80BD7C5500006F -:104E600010B58CB06C46204604F0D2FAA0850D49EE -:104E7000084206D1684601F047FC0A90FF2001F085 -:104E800003FC01F035FC6946884202D10A9801F022 -:104E90003BFC6846808D002801D10CB010BD00F0AD -:104EA00049F9C046FFFF0000F0B59FB00446002C52 -:104EB0002FD10DAC002648222046314600F01BF9C8 -:104EC000032525720D9633480E902046093034494B -:104ED00079440526324604F065F920461730314FF3 -:104EE0007F443946324604F05DF920462730394682 -:104EF000324604F057F926462D362B497944304680 -:104F00002A4604F04FF94020112121541A9604201A -:104F10001E9021480460214C01200102204604F02B -:104F20003BF901AD284604F073FAA88585B2002D3F -:104F30000BD001A8002181850B9801F0E5FB0B98AF -:104F400001F0E2FB102DE7D01FE001AD284601F093 -:104F5000DBFB0B9000F052FBFDF748F8002003F05C -:104F600033F8012003F030F8FEF71EFFFBF736F9A7 -:104F700001F0BEFBA84202D10B9801F0C5FB01A8CD -:104F8000808D0028C8D000F0D5F8FFF769FF1FB06A -:104F9000F0BDC0463A003200181D00201C1D002044 -:104FA000BB4D0000B04D0000994D0000F0B59FB022 -:104FB0000446A068002831D10DAD002748222846BC -:104FC000394600F098F80320009028720D97374872 -:104FD0000E90284609303749794405273A4604F0AF -:104FE000E1F828461730344E7E4431463A4604F004 -:104FF000D9F82846273031463A4604F0D3F82E46F1 -:105000002D362E4979443046009A04F0CBF84020E2 -:10501000112129541A9604201E90A5600027244EC1 -:1050200001AD284604F0F4F9A885304207D101A863 -:1050300001F06AFB0B90F8070FD001F001FB01F0C3 -:1050400057FB01A9884202D10B9801F05DFB01A832 -:10505000808D002828D10127E2E70A2001F0E4F939 -:105060006068022817D004280BD00328E5D1E06837 -:1050700000218161A168E068FEF7DAFDE1688861DE -:10508000DBE7E0680021C162A168E068FEF706FE88 -:10509000E168C862D1E7E068FEF736FE0028CCD0B0 -:1050A000A068FEF761FEC8E700F044F83A0032005D -:1050B000FFFF0000B34C0000A84C0000914C000022 -:1050C00080B5002001F020FB80BDB0B5884208D932 -:1050D000002A0FD0491E401E8B5C8354521EFBD108 -:1050E00008E0002A06D000239CB20D5D05555B1C2C -:1050F000521EF9D1B0BD80B50B46002A03D011462F -:105100001A4604F057F880BDB0B50023002A0FD02E -:10511000401E491E8C5C855C521EA54202D1002AAD -:10512000F8D105E00020C0430123A54200D8034682 -:10513000D8B2B0BD10B5044601F0DAFA214604F049 -:1051400073F9B0B582B0019200920023002A0BD00F -:10515000401E491E0023845C8D5C65402B43521E1B -:10516000F9D100200090019000980199884202D165 -:10517000D8B202B0B0BD0120FFF7DCFFF0B58BB0B4 -:105180000993844B109D2C461C400026002900D119 -:10519000AFE03746119E002E6DD00790089106961D -:1051A0000594581C04952840039000283E4604D1DD -:1051B00006980068002800D19BE00026002A0A9685 -:1051C00001D010680A900898022800D291E0129845 -:1051D000009000200190C4430998C0B20990089B38 -:1051E000079F0294991EB81C002900D180E03C78EA -:1051F0007E7875B2002D22DB07460B4635460998AE -:10520000844213D1002A3AD00798381A1060072137 -:1052100000240A9E864200D82146072906D000298C -:105220002DD000260A99814206D962E07F19AB424F -:10523000184600D328461B1A012BD3D858E08035D6 -:1052400056D07F252E400025002E11D002994E43C6 -:10525000DB1E00252946002B0FD007782D023D4389 -:105260005B1E761C401C002EF5D15B1C0746C6E772 -:1052700007460B46C3E73E463BE00E4639E005983D -:10528000984235D8854233D32E1A0098864202D0F0 -:10529000049800282CDB9E4200D31E4600988642CC -:1052A000024600D83246059C101908998C421FD836 -:1052B0008A421DD888421BD8079CA74218D305985C -:1052C000C119A14214D35018A04211D30A910899D0 -:1052D0006418BC420CD30A99A14209D8A04207D84D -:1052E0000398002808D00598C019069A106000E0BD -:1052F000019E30460BB0F0BD069800680499002965 -:1053000023DB0A99884228D9002A019EF1D0029E07 -:10531000941B0A990919891E80190019401EF41A54 -:10532000059B5B1E5B1BA34200D82346029C009D8D -:10533000641BA34200D823465B1C029D0C780470BA -:10534000491940195B1CF9D122E00A99FFF7F9FECF -:10535000012600220028CCD01AE0002A019EC8D0E5 -:105360000299CB1A0599491E491B994200D8194642 -:10537000029B009C1B1B994200D81946491C002324 -:105380000A9E9CB2355D0555491C5B1C0029F8D16D -:105390001646AEE7FFFFFF3F80B501F08DF900280C -:1053A00000D080BD064800214170602202700222B8 -:1053B0008270C1700171052101F072F980BDC04693 -:1053C0001C1E0020B0B51A48C078032807DC01284D -:1053D0000DD0022828D1174802F075F9B0BD042875 -:1053E0001FD0082820D1134802F06BF9B0BD114C32 -:1053F0000121204602F060F9204602F03FF90E4CF0 -:10540000A079002811D120460C300025042229461D -:10541000FFF771FE1034082220462946FFF76BFE85 -:10542000B0BD044802F04BF9B0BD1020FFF782FE7A -:105430001C1E0020F4210020342100207F21014087 -:105440000020032903D8C8B201490818007B70471F -:105450003421002080B516480179042918D002298A -:1054600006D0012922D1811D134802F00FF880BD1A -:10547000C2787F211140032918D8C9B24A000D4BC8 -:105480009A1800231382821D0B4802F084F880BD15 -:10549000C2787F211140032908D8C9B2054A5218A1 -:1054A00043791373821D044802F01EF880BDC04684 -:1054B0001C1E002034210020F421002070B5154668 -:1054C0000E460446FF2D1BD80E48502101702021A6 -:1054D00001714571E91C817080222243C270090A62 -:1054E0004170062101F0DCF83046294601F0D8F879 -:1054F0007F2020404000044908187D2109010182D5 -:1055000070BDC0461C1E00203421002080B50A4614 -:10551000014682201423FFF7D1FF80BD80B50A46E3 -:10552000014683201423FFF7C9FF80BD80B50C48D6 -:105530000178002900D080BD062181710A21017007 -:1055400008498B784A7812021A43FF232A339A4279 -:1055500000D31A464280C91C0348FFF7B6FD80BD40 -:10556000342100201C1E0020E01F0020B0B5204880 -:10557000827841780902114300780F280ADC0E284E -:1055800010D00F2823D10020012927D1FFF71AFFBF -:105590000120B0BD10281ED0162818D1FFF7C6FF75 -:1055A0000120B0BD13488168643181601621124A20 -:1055B000435A002B08D06424642B1D4600D3254693 -:1055C0005B1B435213420ED0891E0E29F0D10220DC -:1055D000FEF736FDB0BD0020032900D2B0BDFFF7B5 -:1055E00039FF0120B0BD002101701020FFF7A2FD9E -:1055F0001C1E002034210020FFFF0000B0B50A204F -:1056000000F012FF094C0025182220462946FFF71A -:1056100072FD65802570A571A56000F063FB0448EC -:1056200005604560FEF754F9B0BDC0463421002046 -:105630004C210020704700000248002101604160B9 -:105640007047C0464C210020F0B589B00546084699 -:1056500000F0A0FD0446002C43D02069002840D073 -:10566000284600F097FD014602AD1C222846019213 -:10567000FFF72BFD2168E98062682A81A0681A4F34 -:1056800065233B7089B292B24A434243D1084E1C13 -:1056900007231A4200D10E46314600910426864067 -:1056A00070181D30B870000A78700321384600F079 -:1056B000F7FF2846019900F0F3FFA0683870012138 -:1056C000384600F0EDFFE06800F064FDB1B200F094 -:1056D000E7FF009885B2206900F05CFD294600F0E4 -:1056E000DFFF09B0F0BDC0461C1E002070B500F001 -:1056F00051FD044620787F26064000F0DDFF00289B -:1057000030D1002E2ED0E06900281DD000F042FDDF -:105710000546052E02D1A07E002824D0284603F09D -:10572000DDFE064612486521017031461C3181704C -:10573000090A4170032100F0B3FF1C21204600F04C -:10574000AFFFB1B228460BE0094800214170652146 -:1057500001701C258570032100F0A2FF2046294618 -:1057600000F09EFF70BD20462946FFF76DFF70BD1B -:105770001C1E002070B50446002C28D01448066872 -:1057800045688E4201D16D1C45600E43002902D050 -:105790000660324605E00022026042600D4B5B1C51 -:1057A0001E438A4201D000214160082D0CD3032101 -:1057B000284603F001FC012290073043002900D065 -:1057C0003046D107884300E030462946A04770BDE7 -:1057D0004C210020FFFFFF7FF0B581B00F4E012468 -:1057E0003470B11CFF2750377A1C204600F03EFF72 -:1057F000054675707A1B7719F91C022000F036FFF8 -:10580000B8702D187619F47000F024FF30719020D4 -:1058100070710020B071E81D01B0F0BDE01F0020E4 -:10582000F0B58BB00A46064607210E4207D0334634 -:10583000D8B291B2FEF7E0FB80B20BB0F0BD4B20C6 -:10584000840083200390AA4DA84F3346019109E0BC -:105850006920A94908700398801C487002220199A8 -:10586000079B2DE1102130460840049292B2059228 -:10587000002A069600D1B5E0002800D0B2E00793D8 -:105880000091029007E0A1B20022384600F020FF0C -:10589000012000F03FF900F00FFF0028F3D17D2038 -:1058A0000001A9680E1828780928079A42DC072801 -:1058B00048D0092863D100218E48079101F0F8FBF8 -:1058C00010E0FFF769FDA1B20022384600F000FFAA -:1058D000A868B04200D3FEE0FFF748FE00F0ECFEFF -:1058E0000028F0D1834801F039F90028E9D0059A61 -:1058F000D01D4008A92800D3F3E003980D307E4B5B -:105900009854981807994170581D0499891C8AB2B7 -:1059100005921946FFF7D9FB052277480799FFF74B -:10592000EAFB0598401D83B272480399724A01F060 -:10593000D3FB3FE00A2804990AD00B2822D17148F2 -:10594000784401E06E487844059900F035FA31E07A -:105950002046253080B2059E864200D9C1E0532002 -:105960003870B970080A78700321384600F098FE44 -:105970006148314600F094FE002028701DE00028A8 -:1059800000D1ABE0D0B20599FEF736FB002811D06C -:10599000A4E0FFF701FDA1B20022384600F098FE16 -:1059A000A868B04200D396E0FFF7E0FD00F084FE67 -:1059B0000028F0D128780028EBD10020A8712870A9 -:1059C0006880069EB10600D536E7FFF7E5FC300695 -:1059D0000298009906D5089108AA484B1846114626 -:1059E00001DF0298002804D170066ED40020A8714F -:1059F00028700020688000F05FFE002801D1FFF7CA -:105A0000CBFCA1B200223846079200F061FE0228CA -:105A100006D8B9787A7812020A43D11C81423DD166 -:105A2000FFF7A4FD688829780029E4D00028E2D097 -:105A3000354979440422304E3046FFF765FB002893 -:105A40002ED03249794404223046FFF75DFB00280E -:105A50002BD02F49794404223046FFF755FB00280C -:105A600037D103982730C6B200F0D2FDB04200D043 -:105A7000EEE60120204E3070B01C402100F0BAFD4F -:105A80007070811C184A121D1140039B0D33735412 -:105A9000C11C114000237354021D10E00020A7E731 -:105AA000FFF79AFE0246002309E000207070039879 -:105AB0000D30307080200699014302220B46019977 -:105AC000DEB20B4200D1CDE6B2E668880649401846 -:105AD000B2E66888B0E61020FFF72CFB0920FFF73C -:105AE00029FB0220FFF726FBFBFF00001C1E002005 -:105AF0003421002054210020E01F0020BE9A0060C5 -:105B0000C3FBFFFFD9FBFFFFCE490000C1490000E6 -:105B1000B649000070B5044600F0CEFD002801D162 -:105B2000FFF73AFC4B2081000B4E002530462A46F9 -:105B300000F0CEFD3078152806D8012181400748B5 -:105B4000014201D0002C05D1FFF710FD01250028EE -:105B500000D10546284670BD1C1E00202070200084 -:105B600010B5FFF719FC084C4B208100002220469D -:105B700000F0AEFD20780E2801D0FFF7F7FC00F012 -:105B80009BFD0028F0D110BD1C1E0020F0B581B097 -:105B900000920F4604464B4EB74210D0494D0021AB -:105BA000402628463246FFF7A6FA009840280246CB -:105BB00000D3324628463946FFF787FA414EB0787F -:105BC00001280ADC002828D0012869D1F01C042112 -:105BD00000F04EFC402130462BE0022827D005285B -:105BE0005ED13079F17809020143374C20680027F3 -:105BF00081425BD1206800281ED03448009D2918BE -:105C0000334A13686D1FADB2AB4200D21168051D57 -:105C10000D4030480068711D34E0F01C002704225C -:105C20003946FFF768FA40213046A0473EE0254854 -:105C30004021A047002739E0B0797179090201437A -:105C40002548016001684908A8292FD80168204823 -:105C500001607178327812020A4320490A601D49B6 -:105C60001F4A0A60009D691F8AB218495218D21C47 -:105C70000368ED1FADB2AB4200D202680D1D1540A6 -:105C8000F11D17482A46FFF720FA11480168491B01 -:105C9000016010480168491901602068401C2060BB -:105CA0000B48016801200227002907D1064800217E -:105CB000016008480160064801603846C0B201B082 -:105CC000F0BDC04698210020D8210020FBFF000035 -:105CD000E0210020E4210020DC210020E821002038 -:105CE000E01F0020034800210160034801600348D1 -:105CF00001607047D8210020E4210020E02100202D -:105D0000F0B581B0264F3A68264C2168002921D091 -:105D1000002A1FD00090264D002140222846FFF780 -:105D2000EAF90520A87023480168090A297000686B -:105D300068701D490868000AE870086828710968D9 -:105D4000206800290ED03B263B2800D826683968F9 -:105D5000681D12E014480021016039601348017089 -:105D600021601BE03926392800D826682068000AFF -:105D700068712068A8713968E81D3246FFF7A5F9F7 -:105D8000009A09492068801B2060386880193860B3 -:105D90000868401C086006484021904701B0F0BDEB -:105DA000E4210020E0210020D8210020342100201F -:105DB00098210020E821002080B500290BD0064A58 -:105DC00000231360054A1160054A064B1360064A1A -:105DD0001160FFF795FF80BDD8210020E021002051 -:105DE000E4210020E01F0020DC21002081B0F0B57C -:105DF0008EB015460C4606901393022C00D2BAE1E1 -:105E00000698002800D1B6E1002D00D1B3E1069834 -:105E1000214603F0C1F913A809902978002900D17F -:105E2000A9E1671E002602E0A8194178761CC8B2D5 -:105E3000002801D02528F7D1BE4200D33E46069C5B -:105E400020462946324603F0B1F9BF1BA419069437 -:105E5000002F00D18FE1A95DAD19252900D087E180 -:105E60006B1C002020210A220892049005900790C4 -:105E70000446084604E009990A1D0992096804913C -:105E80001D46224629786D1C00242D29F9D047296A -:105E900018DC2F2926DD0B46303B0A2B00D366E1A8 -:105EA0003029044600D10C46079B002B00D0044645 -:105EB0000A23079843435818303807902B4620464A -:105EC0001446DDE7672904DD722921DD73293AD103 -:105ED00022E062293CDC48294BD101460120059093 -:105EE000084617E0252958D02A2926D02E2900D087 -:105EF0003DE129782A2900D03AE16A786B1C012417 -:105F00002A21482AB7D0682AB5D0732AB3D02FE106 -:105F1000682936D11021089109990B1D0993032393 -:105F200013400968012B00D1BBE0022B00D1BAE07D -:105F3000032B2B461446A3D0C6E0297802247329EC -:105F40002B4698D014E1752929D078291CD00EE170 -:105F5000632900D19BE0642900D008E102900397F7 -:105F60000998011D09910068C11742184A40C00FE5 -:105F70001CE0582900D0FAE00146012005900846AF -:105F800002E0702900D0F2E0029003970998011D09 -:105F9000099102680020102709E025207BE002908B -:105FA00003970998011D0991026800200A2701241E -:105FB00097420892049012D8012638460446394682 -:105FC00002F074FFB04209D1384660430799491E78 -:105FD0000791089988422646F0D900E03446079890 -:105FE000411E049B002B00D107990026F243002B91 -:105FF000029800D11A460192C2B2302A06D1002B73 -:1060000004D00AA82D23037000230126881E0D2822 -:106010000BD80AA83043491E049303F0CBF8049B25 -:106020000798801901994018461E002B03D00AA832 -:106030002D218155761C0598002C1AD0002802D0FD -:106040005348784401E05148784407900898214625 -:1060500002F02CFF394602F0AFFF0798405C0AA916 -:1060600088552046394602F021FF761CA742044697 -:10607000ECD9039FBE4200D33E460AA9069C2046A7 -:10608000324603F093F8BF1BA41906946DE00998FB -:10609000011D09910068069908707F1E491C069130 -:1060A00063E0049E16E00878002860D10499B942A4 -:1060B00000D339462022069C2046049103F07AF84A -:1060C00004983F1A24183DE000228B5C521C002BE0 -:1060D000FBD1561E089810282AD1002E47D0002444 -:1060E0003B46085D0F2202400009022B1F4642D3A7 -:1060F000059B002B05D0012B0ED10794224B7B442E -:1061000002E007941F4B7B44D2B29A5C069C6270FB -:10611000C0B2185C2070079C3846871E02282AD01F -:10612000641C0698801C0690B4423B46D9D30DE00F -:10613000BE4200D33E46069C2046324603F036F867 -:10614000BF1BA4190694002F079C14D0B4420ED98B -:10615000A41BBC4200D33C462022069E304621466A -:1061600003F028F83F1B36190696002F03D0297834 -:10617000002900D056E600200EB0F0BC02BC01B0F1 -:106180000847C0460943000021430000C743000000 -:10619000DD43000080B50449884204D303498842A6 -:1061A00001D200F005F880BD0000D0C040ABD0C0E7 -:1061B0007A460249C91C891A401A7047B161D0C099 -:1061C00010B54101104A0A40430E01210B405B42C9 -:1061D0000E4C1C405440820E0A4052420C4B13405D -:1061E0006340C20E0A4052420A4C14405C40020F07 -:1061F0000A405242084B13406340400F084041425E -:1062000006480840584010BDE0FFFF3FB2576A3BC8 -:106210006D8E5026FA19A11EDD33423DB362142A59 -:10622000F0B587B005930492064602910D780027D9 -:106230000120002D03971BD00298401C06900120DE -:1062400000272C46019721464139E2B2202A5FD32C -:10625000C9B21A295CD3FFF7B3FF01460698C25DA5 -:10626000E0200440600948407F1C002A1446EAD11F -:106270000599C919C91D5A2903994CD8FFF7A0FFE0 -:10628000002D0ED002994C1CFFF79AFF0146357085 -:106290001F2028404840611C761C2578002D0C46A4 -:1062A000F2D131213170711C06910599002914D069 -:1062B00000241A4E7E44039404990F5D1F2F29D8A1 -:1062C000F55DFFF77DFF06990D557840641C059933 -:1062D0008C42F1D30699091906910624FFF770FF45 -:1062E000641EFBD10121484019220D497944069BC7 -:1062F0000446D4401F2525404C5D1C70541F5B1C78 -:10630000002A2246F4D1002006998871012102E07A -:10631000019900E00399084607B0F0BD94340000ED -:106320005C340000F0B595B00C46054600200390A3 -:10633000102A1EDC1A99002A03D08E1E262E04D99C -:1063400017E0142901D0202913D104AE32700120A6 -:106350006A46082782C21060701C03A9052200F05B -:106360000AF80398431C0393284621463246FFF758 -:1063700057FF15B0F0BDF0B587B004930191054605 -:106380001046012383405C1E00270E9900910D9951 -:1063900002910C9A002A3E4627D0414205910026E0 -:1063A0003746029976188F4004990B781F43491C91 -:1063B0000491521E03928642069712DB01990B68E4 -:1063C000024620465C1C0C60059CA4192F46069DC5 -:1063D000E540044610462540FD543D46361A8642A7 -:1063E000EDDA039A002A069FDBD1009900290CD030 -:1063F000002E13D001990B68024620465C1C0C60ED -:10640000911B8F400740EF5408E0811B8F402740CD -:1064100000210298864202DA002F00D101210846AD -:1064200007B0F0BD01DF704780B584B0019003482C -:1064300001A9FFF7F7FF04B080BDC0463701006037 -:1064400080B582B002486946FFF7ECFF02B080BD1C -:106450003C02006080B586B001900291039203482F -:1064600001A9FFF7DFFF06B080BDC0467F030060D3 -:1064700080B584B00090019103486946FFF7D2FFD0 -:10648000019804B080BDC0462C05006080B588B07E -:1064900000900191029203930A9804900B98059042 -:1064A00003486946FFF7BEFF019808B080BDC046AB -:1064B0003B07006080B584B00190034801A9FFF755 -:1064C000B1FF029804B080BD7F08006080B584B041 -:1064D0000190034801A9FFF7A5FF029804B080BD11 -:1064E000DB0A006080B586B00090019102920393B0 -:1064F00003486946FFF796FF019806B080BDC04685 -:106500002C0B006080B588B000900191029203933B -:106510000A9804900B98059003486946FFF782FF9C -:10652000019808B080BDC0462B1A006080B586B0C7 -:10653000009001910292039303486946FFF772FFAE -:10654000019806B080BDC046EA2E006080B586B0D6 -:10655000009001910292039303486946FFF762FF9E -:10656000019806B080BDC0462E2F006080B58AB06D -:1065700000900191029203930C9804900D9805905D -:106580000E9806900F98079003486946FFF74AFF58 -:1065900001980AB080BDC046F338006080B586B06F -:1065A000019002910392044801A9FFF73BFF029872 -:1065B00080B206B080BDC0466E92006080B582B0E9 -:1065C00003486946FFF72EFF0198C0B202B080BDB4 -:1065D0004F9F006080B588B00190029103920493B0 -:1065E0000A980590024801A9FFF71CFF08B080BD7A -:1065F000BA53006080B584B00090019103486946A9 -:10660000FFF710FF019804B080BDC046FCA80060F1 -:1066100080B582B003486946FFF704FF0198C0B215 -:1066200002B080BD3CA0006080B584B001900348FA -:1066300001A9FFF7F7FE029804B080BD586400601E -:1066400080B582B002486946FFF7ECFE02B080BD1B -:106650008D68006080B582B003486946FFF7E2FEAE -:10666000019802B080BDC0466E6A006080B586B0F9 -:10667000019002910392034801A9FFF7D3FE02980B -:1066800006B080BDD474006080B584B0019003482A -:1066900001A9FFF7C7FE04B080BDC046BE9A0060E6 -:1066A00080B584B00090019102486946FFF7BAFEB8 -:1066B00004B080BD8183006080B582B00348694624 -:1066C000FFF7B0FE019802B080BDC046BB840060F9 -:1066D00080B586B0019002910392044801A9FFF7AA -:1066E000A1FE029880B206B080BDC046E48500607D -:1066F00080B582B003486946FFF794FE019802B066 -:1067000080BDC046B187006080B584B00190034869 -:1067100001A9FFF787FE029804B080BD758800606C -:1067200080B584B00190044801A9FFF77BFE029870 -:10673000C0B204B080BDC0468B9C0060F0B585B08F -:106740003A4A1278002A03D083213A4A7A440BE06D -:106750000A9A452A03D88321374A7A4404E0072954 -:1067600007D18321354A7A44022300F0B5FC05B0F5 -:10677000F0BD0192029040200393185C0490002821 -:1067800022D004980528039D08D1284641302C4981 -:1067900079440522FEF7B8FC002833D041350027A4 -:1067A000284E7E44049C0321384602F07FFB0221E0 -:1067B000C9434143705C297841402970641E761CAE -:1067C0006D1C7F1C002CEED145200399085C4630DF -:1067D000019A904210D141311548049C2246FEF79F -:1067E00074FC0720114988714C8009200870012130 -:1067F000029800F05DFCBAE78321134A7A44022331 -:106800000298B2E70A4D03222A70681C0F497944A6 -:10681000FEF75BFC281D0E4979440422FEF755FC67 -:106820002878431D832102982A469EE734210020C0 -:10683000E01F0020E53C0000D93C0000CF3C0000F8 -:10684000A73C00009B3C00004A3C00002F3C00009D -:10685000293C0000F0B581B01D460E46044628468E -:1068600000F016FC00280ED02068C11C090A6A46F8 -:106870009170811C090C5170411C090E1170001D92 -:106880002060D07004E0684604222946FEF71DFC13 -:10689000174F082238463146FEF717FC38460830B5 -:1068A00069460422FEF711FC002078730221397337 -:1068B0000121B973F8733874284600F0E9FB0146EA -:1068C000201D8625002906D029467931C9B2042227 -:1068D000FEF711FC03E069460422FEF7F6FB044ACA -:1068E00011232046294600F0F7FB01B0F0BDC04659 -:1068F000E01F0020F0B583B0029088794B791F0229 -:106900000743887801904B780E781546093DACB264 -:10691000A74204D0D01FD21F92B297421BD13D464E -:10692000002E08D083211C4A7A440223029800F0EA -:10693000D3FB03B0F0BD022B18DC012B23D0022BBC -:106940001DD1A8B26A461060CB1D002202980199A1 -:10695000FFF7F4FEEDE7E4B2A742E1D0D2B29742EE -:106960000546DDD083210D4A7A44DEE7032B0ED0A5 -:10697000C12B04D183210A4A7A440423D6E7832118 -:106980000A4A7A44D1E78321064A7A44CDE7832133 -:10699000054A7A440823C9E72C3B0000CB3A0000A3 -:1069A000D83A0000A53A0000B63A0000D43A0000F8 -:1069B00080B5C1698A784B781B0213430A78812A13 -:1069C00009D0832A0CD0862A0ED1C91C031D0022AF -:1069D000FFF740FF80BDCA1C812100F07DFB80BD18 -:1069E000C91C1A46FFF786FF80BD000070B50D4632 -:1069F0000146012A11D1094C20462A46FEF765FBC3 -:106A000060194026721B00252946FEF774FB812081 -:106A1000214632462B46FEF751FD70BD98210020DD -:106A20000282C1600022C282827642858284C16174 -:106A300002627047F0B583B00D4604462A20215CFF -:106A400020462A3001294AD000293BD12B2100229F -:106A5000625423462B332027E15DC91EC9B2264666 -:106A6000203601293ED8218BE28A91423CD9402030 -:106A7000012D00D038460290A07E03230126002875 -:106A800000D033460027012D3E4600D12E46B600E9 -:106A900033431E46029B9B1B891A1A46914200DC17 -:106AA0000A4691190291012D08D1211D2A48042777 -:106AB00001923A46FEF709FB019AA07E002820D0F9 -:106AC000FF302BE02521615C062908D12B21625C77 -:106AD0000023635423462B33002A03D1BBE72B202A -:106AE0000021215403B0F0BDFCD10021A176E18248 -:106AF00019700170B1803160E068E0611548017083 -:106B0000F0E74020205CB9B2134B585401203843C1 -:106B100081B2637E104F7B54471C207EB9B20E4B6E -:106B20005854E169002907D01746BAB29819E38A88 -:106B3000C918FEF7CAFA3A46E08A1018E082A07E29 -:106B4000401CA076029881B203482A46FFF74EFF08 -:106B5000C8E7C046342100209821002001462A20A1 -:106B60000A5C0120002A10D0012A01D100200CE08B -:106B700025200A5C0020062A07D12B200A5C012070 -:106B80000021002A01D0084670477047B0B52B217C -:106B900001244454011D0B4D04222846FEF795FAAA -:106BA00000206871832028710220A8716920E87193 -:106BB0007C20C043801C2872092128462246FFF70A -:106BC00015FFB0BD98210020B0B52B2101244454FD -:106BD000011D084D04222846FEF777FA002068714F -:106BE00088212971A871072128462246FFF7FEFE59 -:106BF000B0BDC04698210020F0B581B004462520E4 -:106C0000205C26462536002505286AD008784B7872 -:106C10001B0203438878CD782D02054328041843CE -:106C2000237965792D021D43A379E7793F021F433C -:106C30003B042B43834257D108790B1D658C002DF3 -:106C400013D02423E75C23462433B8424CD1278B4E -:106C5000401C18707B1B501F984200DB18464219DD -:106C6000628482B2208D491D23E07C25ED436D1D99 -:106C7000EFB28325B84204D12046FFF7A5FF0125D6 -:106C80002FE08F79497909023943C91CA8422BD1D9 -:106C9000208B8DB2A84227D189B2164D242700201F -:106CA000E055121F8A4200DB0A46628415401946ED -:106CB0002A46FFF773FC2085218B628C01258A42CE -:106CC0000FD3E18C88420FD1062030700020608401 -:106CD0002A20205C012804D12046FFF757FF00201E -:106CE0003070284601B0F0BD052030701020FEF74E -:106CF00021FAC046FFFF0000F0B589B004462372B8 -:106D00002020205C2646203603280AD02A25675DED -:106D100025462A35002F1BD02046FFF76DFF00289F -:106D200014D1D74806210172042131707A21C94358 -:106D30003A314022A1540830E0610020A076E08280 -:106D400001202083217A2046FFF774FE09B0F0BDB0 -:106D5000042809D12B2000272754A776E7822F701B -:106D6000B7803760E068E06108910020012B00D116 -:106D700018468700012039460143079191423BD8CC -:106D80000390012B06930492059707D1201D04223E -:106D90000899FEF79AF9059F049A069BE08A002855 -:106DA0000CD0012B24D120461230211D0422FEF7E5 -:106DB000ABF9059F049A069B002819D00321384699 -:106DC0000843904218D800910899C8190290C857F2 -:106DD0000F467A21C9437A3149B28525884225DD9B -:106DE000A7480421017231703A3540216554A2E769 -:106DF00002203843904202D9A148852193E72120FF -:106E0000205C984246D13078012851D1012B7FD1A6 -:106E1000211D042208980392FEF776F9059F0028A9 -:106E200076D097480621017203997EE70195012BE0 -:106E300014D1307801281ED1251D2146123104229B -:106E40002846FEF761F9069B002807D002980078D3 -:106E50000199491CC9B2884200D0E8E03078012885 -:106E600009D1012B00D080E0029800780199491CDB -:106E7000C9B2884279D1079978184078795C0F02B5 -:106E80000743208AC01E87421FDD7D48009901729A -:106E900004216DE07A20C04301460831784A11721E -:106EA000042131703A30402160540832E26144E7F5 -:106EB000012B56D12B2000212154A176E18229708B -:106EC000B1803160E068E06140E702980078812895 -:106ED00005D08628019D51D0832800D097E0012B52 -:106EE00057D1251D67497944042228460892FEF7A8 -:106EF0000BF9002807D06449794404222846FEF79C -:106F000003F9002845D15E480B21017208992FE052 -:106F1000089AD119D05DA27E904222D10498079A96 -:106F2000851AE08A228B121A954200DB1546AFB211 -:106F3000E2691018491C3A46FEF7C7F8069901297C -:106F400008D1E08AE1690918E08C3A46FFF726FB90 -:106F50000699E084E08A2818E082A07E401CA07692 -:106F60003CE0474804210172DFE6454804210172F4 -:106F70003170019A3A3240216254DCE6012B6AD129 -:106F8000201D4249794404252A46FEF7BDF8002811 -:106F900070D004980599451AFF1CBD4200DB3D46A0 -:106FA000AAB2E06902990892FEF78FF8069B012BBE -:106FB00006D1E1690020089AFFF7F0FA069BE08409 -:106FC000212023542783E5820020A076204612301A -:106FD000211D04221D46FEF778F82946E08A012982 -:106FE00001D1218B06E0218BCA1C824202D22448A7 -:106FF000032198E6884204D20020606301203070AB -:10700000A4E6022030702046FFF7D2FC9EE61C4822 -:10701000039B037204213170019A3A324021625479 -:107020000830E0610020A076E08223838AE6144CD9 -:10703000042220462946FEF748F800206071019896 -:107040003A302071039AA2710620E071082120468F -:10705000FFF7CCFC7AE60A48039A027204213170E9 -:107060003A35402165540830E0610020A076E08286 -:10707000228367E602480B210172357079E7C0462A -:10708000982100207235000064350000D8340000DB -:1070900080B5064979440422FEF736F801460120FE -:1070A0000022002900D0104680BDC046C433000035 -:1070B00080B52A22835C02462A32002906D0002BA2 -:1070C00008D101211170FFF761FD80BD012B01D1B5 -:1070D0000220107080BD000070B504462A20205C9C -:1070E000002809D0012824D02520205C062820D1A2 -:1070F0002B20205C00281CD1202003252554402073 -:1071000021540020A076E261E08223832120215CCB -:107110002546213503290DD1084E3078002808D0A6 -:10712000032100E029782046FFF784FC307800280E -:10713000F8D170BD2046FFF77DFC70BD34210020E2 -:10714000024900200860024908607047F0210020D1 -:10715000EC21002010B50748002444704F21017035 -:10716000012181700221C1700421FFF799FA2046A4 -:1071700010BDC0461C1E002070B582B06D460024B4 -:107180006C704F262E700220A8700320E8702C71BE -:1071900005212846FFF784FA6C702E700120A87034 -:1071A000E87004212846FFF77BFA204602B070BD44 -:1071B00010B582B001A8002444704F210170012154 -:1071C00081700221C1700421FFF76AFA204602B0E3 -:1071D00010BD0000B0B582B014480024046014480B -:1071E00004606D464F2028706C700520A870042044 -:1071F000E870012028716971AC71012A05DC002A50 -:107200000AD0012A0AD1042006E0022A03D0032A68 -:1072100004D1022000E00320694688716846C371EA -:107220000821FFF73DFA002002B0B0BDF021002098 -:10723000EC21002010B582B06846002444704F2233 -:107240000270052282700422C27001220271417113 -:107250008471C4710821FFF723FA204602B010BDE3 -:10726000B0B582B00D4668460024447050210170CC -:1072700003218170C5704021017144710621FFF71F -:107280000FFA8020054201D0074800E00548016858 -:107290007F2215400122AA400A430260204602B024 -:1072A000B0BDC046F0210020EC21002070B582B0B6 -:1072B0000D466846002444705021017003218170FE -:1072C000C5708026067144710621FFF7E9F9354241 -:1072D00001D0074800E0054801687F2215400122DF -:1072E000AA4091430160204602B070BDF021002009 -:1072F000EC2100208020014201D0064800E0044833 -:1073000002787F2001400120884010407047C0462D -:10731000F0210020EC21002010B582B06846002446 -:1073200044704F220270022282700322C2700171E7 -:107330000521FFF7B5F9204602B010BDB0B582B007 -:107340001C461546684650220270C170202101710A -:107350004471E11C8170090A41700621FFF7A0F910 -:1073600028462146FFF79CF9002002B0B0BD10B5B9 -:1073700082B0684600244470502303700323837056 -:10738000C1703021017142710621FFF789F9204651 -:1073900002B010BD70B515460E4604460220002C02 -:1073A0000FD0D421204601F0F7FE002E01D0B020EE -:1073B00026509C200121215425702046FFF7C0FE55 -:1073C0000020C0B270BDB0B504469C2001212154FC -:1073D000B4256059002806D04068FEF7DBFE02465F -:1073E0002179204690470835CC2DF2D12046FFF771 -:1073F000DFFE2046FFF7AEFE0020B0BD0223002ACC -:1074000007D00023022804D8C0000818B421425035 -:107410000023D8B2704780B5FFF7AEFE002080BDD4 -:10742000F0B581B00C4605460026B4272846314603 -:1074300000F066F9002807D0E8590068FEF7AAFEB8 -:1074400002462846214690470837761C032EEDD188 -:10745000002001B0F0BDF0B581B00C460546002615 -:10746000B4272846314600F04BF9002807D0E859E8 -:107470004068FEF78FFE02462846214690470837AF -:10748000761C032EEDD1002001B0F0BDB0B504464E -:107490002546A835284600F077FB9420012121508D -:1074A000AE20205A98216050A820215C1F2008405F -:1074B000022808D001280BD000280ED120462946EA -:1074C00000F02BF90EE02046294600F0D8FA09E03A -:1074D0002046294600F0AFFA04E080200140204613 -:1074E000FFF7BEFE0020B0BDF0B583B002920446A7 -:1074F000019100291CD025469C350027B426204642 -:10750000394600F0FDF800280DD0A0598069002808 -:1075100009D02978032906D1FEF73CFE0346204610 -:107520000199029A984708367F1C032FE7D12FE074 -:107530009420205803282BD1E16D206E81420AD976 -:10754000091AE165814200D301468AB220460299B8 -:1075500000F0C7FD1CE026469C360025B4272046D7 -:10756000294600F0CDF800280BD0E059006900282A -:1075700007D03178032904D1FEF70CFE01462046DE -:10758000884708376D1C032DE9D1204600F0B0FD77 -:10759000002003B0F0BDF0B581B004460091002991 -:1075A0001BD027469C370026B4252046314600F0E4 -:1075B000A7F800280CD060594069002808D0397815 -:1075C000032905D1FEF7E6FD0246204600999047C3 -:1075D0000835761C032EE8D14DE09420205802286F -:1075E00042D1E069266AB0420AD9D022A15889194D -:1075F000A150801BE06182B2204600F064FD33E0C0 -:10760000A5692846314601F0D7FCB5420FD30029C1 -:107610000DD19820205826469836854207D200255D -:10762000204629462A4600F04EFD35601CE02646DD -:107630009C360025B4272046294600F061F8002832 -:107640000BD0E059C068002807D03178032904D155 -:10765000FEF7A0FD01462046884708376D1C032D24 -:10766000E9D1204600F050FDA020205CA034012884 -:1076700001D100202070002001B0F0BD70B504469B -:107680009C20012121544020206220660025B42640 -:107690002046294600F034F8002807D0A059406859 -:1076A000FEF778FD024621792046904708366D1C8A -:1076B000032DEDD1002070BD017400207047002023 -:1076C00070470020704770B504469C20205C03285A -:1076D00014D10025B4262046294600F011F80028D0 -:1076E00008D0A059C069002804D0FEF753FD014618 -:1076F0002046884708366D1C032DECD1002070BD54 -:1077000002460020022907D8C8001018B4214158A9 -:107710000120002900D10846704780B54A78042A24 -:1077200008DD072A0FDC052A14D0062A1BD100F039 -:1077300021F81DE0002A10D0012A17D0032A12D107 -:1077400000F034F914E0082A0AD0092A0BD100F01D -:10775000BDF80DE000F094F80AE000F005F907E04C -:1077600000F0EBF804E000F0E3FB01E000F03BF98F -:10777000002080BDB0B582B00D46044601A80021AE -:1077800001806A88100A052812DC01281CD0022812 -:1077900024D0032837D1D0B2022839DC00285FD0AA -:1077A000012865D002282ED1B0202058C0680EE0F4 -:1077B00006281CD0072823D00F2824D1B020205819 -:1077C000C069002803D11EE0B02020580068FEF7F1 -:1077D000E1FC0246207C01A990472FE0B42020580C -:1077E00000282CD0217C002922D0C06A21E0207CF6 -:1077F000002808D1B4202058002804D0406B18E09D -:10780000207C00280ED02046294600F091FB25E080 -:10781000032829D004282FD00528F4D1B0202058DF -:107820008069D4E7B42020580028ECD0006B00E039 -:10783000806AFEF7AFFC014601A88847014601A80F -:107840000288002A0AD0E888002807D0824200D3A4 -:10785000024601A80280204600F020FC02B0B0BD24 -:10786000B02020584068B2E7B02020580069AEE749 -:10787000B02020588068AAE7B02020584069A6E7C9 -:1078800070B50446888800280BD1C888002808D124 -:1078900048887F2606409C20205C25469C3503288E -:1078A00003D1204600F044FB70BD9E202654F1B267 -:1078B0002046FFF731FD204600F01AFC002E02D0D2 -:1078C0000220287070BD0120287070BD70B50D4673 -:1078D0000446AE78022E1DD29C20215C20469C30AE -:1078E000032907D0022915D1002E22D0666003217A -:1078F000017009E0002E12D06068B04219D0C1B208 -:107900002046FFF7A8FD666020463146FFF788FD58 -:1079100002280ED12046294600F00AFB70BD022144 -:107920000170666020463146FFF795FD204600F065 -:10793000DFFB204600F0DCFB70BD80B5CA88012A61 -:107940000AD19C22825C032A09D0022A04D1002198 -:1079500081600146083103E000F0EAFA80BD011DB4 -:10796000012200F09BFB80BDB0B504469C20205C4A -:10797000FE220240022A15D10120E060A4202158F5 -:1079800025460C350320002905D0204600F0BCFB1D -:10799000E16802200843E06002222046294600F008 -:1079A0007DFBB0BD204600F0C3FAB0BDB0B50D46BA -:1079B00004466888012815D1A42001212150287986 -:1079C00002280CD8C0002018B4214058002806D046 -:1079D0008068FEF7DFFB0246204629469047204696 -:1079E00000F086FBB0BDB0B50D4604469C20205C7F -:1079F000FE210140022919D1688801281AD1A4204A -:107A000000212150287902280CD8C0002018B42168 -:107A10004058002806D08068FEF7BCFB024620468E -:107A200029469047204600F063FBB0BD204629461A -:107A300000F07EFAB0BDB0B50D4604469C20205C37 -:107A4000032816D12879022813D8C0002018B421A1 -:107A5000405800280DD08068FEF79CFB0246204667 -:107A600029469047E888002807D1204600F040FBCF -:107A700003E02046294600F05BFA0020B0BDB0B517 -:107A80000D4604462878602202402979202A0FD129 -:107A900002290DD8C8002018B4228058002807D029 -:107AA0008068FEF777FB024620462946904769E04A -:107AB0006878002816D001281DD0032862D19C20A8 -:107AC000205C03281BD16888002807D18020084348 -:107AD000802803D02046FFF7C3FB297902294ED81E -:107AE000C80040E09C20205C032817D0022810D159 -:107AF00048060AD146E09C20205C032827D00228B3 -:107B000007D18020084380283CD02046FFF7A8FBFF -:107B100038E02046294600F00BFA33E07F20084089 -:107B2000000120180546543514308022114200D03F -:107B300005462046FFF7DEFB0121002800D1014663 -:107B4000296002222046294600F0A8FA1AE0688837 -:107B5000002817D1480612D02046FFF7A7FB287946 -:107B600002280CD8C0002018B4214058002806D0A4 -:107B70008068FEF70FFB02462046294690472046C4 -:107B800000F0B6FA0020B0BD0A7802704A78427060 -:107B90008A78CB781B02134343800A794B791B0206 -:107BA000134383808A79C97909021143C1807047E0 -:107BB00010B504468021FFF753FB00212046FFF754 -:107BC0004FFB10BD70B582B00D46044601A90020E0 -:107BD0000880694608702A7860211140002910D079 -:107BE000202938D169780A460A3A022A33D3022971 -:107BF0001BD0032919D02046294600F099F902200C -:107C000029E069780B2913D00A290ED0062922D140 -:107C10006888000A002221280ED02228114616D199 -:107C200001AE304600F058F80AE0694601220EE045 -:107C3000204600F05DFA0DE001AE304600F032F86B -:107C400001463288E888824200D3024632802046CC -:107C500000F024FA0020C0B202B070BDF0B581B0CF -:107C6000044682210326402532462B46FFF7B2FA0E -:107C700002272046394632462B46FFF7ABFA20460C -:107C800039462A46FFF773FB002001B0F0BD10B55E -:107C900004468221FFF7CEFA02212046FFF7CAFAF6 -:107CA000002010BDAC21094A515C0922012905D0F0 -:107CB000002906D107497944092204E0044979449E -:107CC00001E000221146028008467047F42100209E -:107CD000A2270000B6270000F0B581B00446AC2012 -:107CE0001349085C2221002819D001281AD1104814 -:107CF0008121032740263A463346FFF76BFA0125D8 -:107D00000B4829463A463346FFF764FA08482946A5 -:107D10003246FFF72CFB08487844222104E005484E -:107D2000784401E000210846218001B0F0BDC04642 -:107D3000F4210020772700005D270000F0B581B016 -:107D4000044681210326402532462B46FFF742FA9E -:107D500001272046394632462B46FFF73BFA20469C -:107D600039462A46FFF703FB002001B0F0BD0000B2 -:107D700080B5012903D103480121FEF75BFE0020F5 -:107D800080BDC04654210020B0B5144601290DD154 -:107D9000012540222946FFF7EAFA2846FDF74EFB67 -:107DA0000246034821462B46FEF7A6FF0020B0BD41 -:107DB0005421002080B5022903D103487844FDF7FF -:107DC0009FFF002080BDC0464DD7FFFFB0B51446D1 -:107DD000022919D102214022FFF7C9FA0B4DA879D7 -:107DE000002811D10220FDF729FB024609487844FA -:107DF0002146FDF7CBFE022806D10720287001207E -:107E0000A8710348006868800020B0BD34210020BC -:107E1000DC2100201BD7FFFF70B50446832103251A -:107E200040262A463346FFF7D5F9204629462A46FA -:107E30003346FFF7CFF9204629463246FFF797FA37 -:107E4000002070BD002070470020704780B50329D6 -:107E500003D103487844FDF753FF002080BDC0469E -:107E6000C5D6FFFFB0B51446032919D1032140221E -:107E7000FFF77DFA0B4DA879002811D10320FDF7FB -:107E8000DDFA0246094878442146FDF77FFE0228C4 -:107E900006D10B2028700520A8710348006868806F -:107EA0000020B0BD34210020DC21002093D6FFFF4C -:107EB00012200880014878447047C0468628000098 -:107EC00004200880014878447047C0468828000094 -:107ED0000E200880014878447047C0467C28000086 -:107EE0000E200880014878447047C0467A28000078 -:107EF0000A200880014878447047C046782800006E -:107F00000E200880014878447047C0465A28000077 -:107F10000E200880014878447047C0464A28000077 -:107F200039200880014878447047C04693250000F6 -:107F300080B50A7852B2002A02DBFFF739FE80BD15 -:107F40004A78772A0FD0062AF7D14A88194B9A42E5 -:107F5000F3D1CA881221122A00D30A46164979445D -:107F600000F09CF880BD8A88042A09D1CA8828219B -:107F7000282A00D30A461149794400F08FF880BDC1 -:107F80008A88052A09D1CA889221922A00D30A46F2 -:107F90000B49794400F082F880BD8A88072ACCD149 -:107FA000CA88B221B22A00D30A460649794400F0B1 -:107FB00075F880BDEE030000B6250000AE25000078 -:107FC000BC2500003426000070B504462348002577 -:107FD000D4222946FDF78FF8214E30460C3004227A -:107FE0002946FDF788F81036082230462946FDF765 -:107FF00082F8002C2DD0194C0025D4222046294689 -:10800000FDF779F81949794420462A46FFF7C2F965 -:10801000174A7A4428462146FFF7F0F90120154A0D -:108020007A442146FFF7EAF9FF2252320D480E4901 -:10803000FEF7F6FC0220104A7A442146FFF7DEF9EB -:10804000032140222046FFF792F92046FFF7E3F98B -:1080500070BD0248FFF7B7F970BDC046F42100209B -:108060003421002054210020E01F0020EE240000D5 -:1080700082260000AC260000CC2600006021018092 -:10808000014878447047C046F62600000A21018066 -:10809000014878447047C04646270000B0B50C46FA -:1080A000942102234350D02144508261C261016A6D -:1080B000914200D80A4693B2002529462246FFF78E -:1080C0003DF92846B0BDB0B50C46016A914200D8D2 -:1080D0000A4693B2002529462246FFF72FF9284683 -:1080E000B0BD10B500242146FFF741F9204610BD70 -:1080F00010B59421042242500024214622462346F2 -:10810000FFF71CF9204610BD10B5942105224250FE -:10811000002421462246FFF72AF9204610BD000020 -:10812000B0B512490A780120012A1DD8521E0C232D -:108130005343CB181A8B002A16D01969002913D083 -:108140009B8A002B06D194000C190325ED4364593A -:10815000E41C09D1934206D29A0089180322D24323 -:108160008958891C00D00020B0BDC0461C1D0020CD -:1081700010B50E490A780120012A16D8521E0C2388 -:108180005343CB181A8B002A0FD0196900290CD041 -:108190009B8A541E9C4208DD921E9A4204DD9A007E -:1081A00089184968891C00D0002010BD1C1D0020C2 -:1081B0000848017800290AD00C224A4380184189D6 -:1081C000028901208A4203D8FF208A4200D300207E -:1081D00040B270471C1D0020F0B581B00146164A20 -:1081E0001078012826D8401E0C234343D218168B42 -:1081F000002E1FD01569002D1CD0022E1AD3948A90 -:1082000013461433771EA74214DDB61EA6420ADBBE -:10821000A600AD196D68AE1C0CD0ED1C03D1002179 -:108220001980D18204E0D482621C1A80002901D016 -:1082300000F03EF801B0F0BD1C1D002080B501200B -:10824000FFF7CAFF80BD0000B0B5174908780128C4 -:1082500029D8401E0C22424389180A8B002A22D0BA -:108260000C69002C1FD0022A1DD38D8A0B461433B3 -:10827000002D0AD0AA00A2180324E4431259921C2C -:1082800011D0CD82691E19800BE095006419032579 -:10829000ED436459E41C06D1044C14191C80521E91 -:1082A000CA8200F005F8B0BD1C1D0020FEFF0000D2 -:1082B000F0B581B004460C2060431A490E183069AD -:1082C000B18A890040583746143710360321C94314 -:1082D000884224D8FDF75EFF31683A8892008958B9 -:1082E00005680846FDF756FF002D06D00068FDF72B -:1082F00051FF01462046884711E08068FDF74AFF9C -:1083000005463068398889004058FDF743FF4068CA -:10831000FDF740FF02462046294600F061F801B013 -:10832000F0BDC0461C1D0020F0B581B02B4D287853 -:10833000012825D8401E0C2670432A18108B0028CF -:108340001ED0116900291BD0928A824218D2900057 -:108350000858FDF71FFF806829784C1E66430028E7 -:1083600010D0A8190169808A80000858FDF712FF13 -:108370008068FDF70FFF01460022204600F030F82C -:1083800001B0F0BDA819038B002BF9D0828A0146F9 -:1083900014319B1E9342F3DB05699600AE190096DB -:1083A0007768FE1C13D0BE1CEAD1009E7668B61C0E -:1083B00009D1521C96B2B34204DBB600AE197668FE -:1083C000B61CF6D00A80C282501C088002E000224F -:1083D0000A80C2822046FFF76BFFD1E71C1D0020F8 -:1083E000F0B583B001920C460C2211460290414335 -:1083F0001F4B5F180021398339617961181DFCF723 -:108400007AFE20463C4610343D4618353E46163628 -:10841000143700282AD0FDF7BDFE206029888A0085 -:108420008258521C06D0491C8AB292008258521CB3 -:10843000F9D129800198002815D0FDF7ABFE05463B -:1084400020683988890040580BE0FDF7A3FEA84258 -:1084500009D038883080401C388080B28000216884 -:108460000858411CF1D10298FFF722FF03B0F0BD7C -:108470001C1D002080B50A49884208D0094988425D -:1084800008D00949884208D1FFF7DEFE05E0FFF772 -:108490004BFF02E00120FFF79FFE002080BDC04699 -:1084A00003000080020000800100008010B501463A -:1084B000002000290FD1084C218BA28A8A420AD2BF -:1084C0002069FDF767FEA18A89004058FDF762FE2A -:1084D0004068FDF75FFE10BD1C1D002080B50348FD -:1084E0000078401EFFF7E2FF80BDC0461C1D002043 -:1084F00010B5044600F07CFC2420604308490818AD -:10850000C42105224254C021064A7A444250BD216A -:1085100001224254D021044A7A44425010BDC04640 -:108520001C1D0020DA22000059FFFFFF80B500F07B -:1085300041FB9D22002806D003498A5C112A02D102 -:10854000B422024B8B5280BD1C1D00200A8000000B -:1085500010B50446FFF7CCFF2420604304490818F7 -:10856000CC21044A7A444250204600F017FC10BD4A -:108570001C1D0020C5FFFFFF80B500F01BFB9D22E6 -:10858000002806D003498A5C102A02D3B422024B89 -:108590008B5280BD1C1D00200A80000010B50446CF -:1085A000FFF7A6FF2420604304490818CC21044AA1 -:1085B0007A444250204600F0F1FB10BD1C1D002003 -:1085C000C5FFFFFF70B50546FFF788FF0446114E53 -:1085D00030469C3020222946FCF777FD687801461A -:1085E000103905290AD29D20305C0F2101408800F6 -:1085F0002058B82170509C36304670BD022803D0F8 -:108600000128F8D1616800E0E16800200029F2D17A -:10861000F3E7C0461C1D002010B5044600F0E8FB3F -:10862000242060430B490818C42106224254C0216B -:10863000094A7A444250BD2101224254CC21074AC2 -:108640007A444250D021064A7A444250204600F0F3 -:10865000A5FB10BD1C1D00205222000081FFFFFF62 -:1086600029FEFFFFF0B587B00E46FFF71FFF06900B -:108670004B4C20460C300025022729463A46FCF791 -:108680003AFD20460E30059529463A46FCF733FD63 -:10869000701C049002D0A06800287DD00698406825 -:1086A000FDF778FD054600F019FF29180122059213 -:1086B000012871DB60680590A0680290002003909B -:1086C000069001952B468B42039C1A4620D200202F -:1086D0001A46044626469D19C01D741C722813D8DC -:1086E0002F781F2F04DD202F09D02D2F07D003E076 -:1086F000092F04D00A2F09D05F2F00D015462A4633 -:108700001D198D42E6D303E0344601E09A19741C2A -:108710001819884224D2002C069D22D09A4220D0DB -:108720000025ED43455D2C2D06DC2E46093E022E2C -:1087300016D3202D14D003E02D2D11D05F2D0FD096 -:1087400000782C2805DC0546093D022D08D3202899 -:1087500002E02D2804D05F28069D02D0D41A00E044 -:10876000069D0498002806D00598A84203D10598D4 -:10877000029A90420AD31B19681C8B4200D32846E8 -:108780008B4206909FD3401C059005E004480146AB -:10879000CC810198181A8881059807B0F0BDC046B1 -:1087A0001C1D0020B0B50446FFF7A2FE094D696804 -:1087B0002046FFF757FF242060432818CC21064AA3 -:1087C0007A444250D021054A7A444250204600F073 -:1087D000E5FAB0BD1C1D00201D00000015010000C1 -:1087E000F0B583B00546FFF779FE0446374E3046B4 -:1087F0009C3020222946FCF768FC6878102816DC9B -:10880000012833D002283BD010285AD120680028F4 -:1088100041D0B468FDF7BEFC03467068B1686A4693 -:10882000401C03C2012C41D82A4A7A4440E0014648 -:108830001139032945D20F210840401E4000371846 -:10884000FD89002D3DD06068FDF7A4FCB989401872 -:108850006946086034461C348021204A7A44204608 -:108860002B46FDF7C3FAB82034502AE0FFF758FC36 -:1088700001460020002924D07168002923D020E07F -:10888000FFF776FC00281CD07168B068421E0020FB -:10889000914216D117E07168B0686A4610603046A0 -:1088A0001C304B1C80210C4A7A4404E0084A7A446C -:1088B00030461C308021FDF799FA30461C30B82133 -:1088C00070509C36304603B0F0BDC0461C1D0020E1 -:1088D0009620000021140000A7200000F9200000CD -:1088E00080B5174988420BD01649884213D01649E3 -:1088F000884222D11548416800291CD0491E14E045 -:1089000012498868002803D04968401E884214D163 -:10891000FFF70AFD11E00D4841688268521E91423E -:1089200002D1FFF78BFC08E0491C41600078401E33 -:10893000FFF738FF01E0FFF787FC002080BDC0464D -:108940000300008002000080010000801C1D002048 -:1089500070B50446FFF72CFC01280BD0401C0FD14A -:108960001C4E301D00250C222946FCF7C4FBE843B1 -:10897000706005E01748001D00210C22FCF7BBFBCE -:10898000204600F035FA2046FFF790FD40680028A9 -:1089900019D00020C1432046FFF764FE0D4DA860AA -:1089A000002807D1281D00210C22FCF7A4FBA86891 -:1089B000002804D0401E6968814200D968602046C2 -:1089C000FFF7F0FE70BD0348001D00210C22FCF7EC -:1089D00092FB70BD1C1D002070B50546FFF77EFDA3 -:1089E0000446124E30469C3020222946FCF76DFB8F -:1089F00068780F2806DC01280AD0022812D1FFF778 -:108A0000B7FB07E010280AD011280BD1606807E0F7 -:108A1000FFF786FB01460020002903D070BD2068C7 -:108A2000B82170509C36304670BDC0461C1D0020D9 -:108A300010B5044600F0DCF9242060430B49081807 -:108A4000C42105224254C021094A7A444250BD2122 -:108A500001224254CC21074A7A444250D021064A8E -:108A60007A444250204600F099F910BD1C1D0020A8 -:108A7000121F00007DFFFFFF11FAFFFF70B50546D2 -:108A8000FFF72CFD0446164E30469C302022294626 -:108A9000FCF71BFB68780F2807DC012812D002289E -:108AA00013D00F2818D1206809E01038022813D2FB -:108AB0009D20305C0F210140880020184068B821BB -:108AC000705009E0FFF72CFB01E0FFF751FB014676 -:108AD0000020002900D070BD9C36304670BDC046D5 -:108AE0001C1D002010B5044600F082F924206043CC -:108AF00008490818C42106224254C021064A7A4473 -:108B00004250BD2101224254D021044A7A444250AD -:108B100010BDC0461C1D0020FE1E000065F9FFFFB1 -:108B200010B5044600F064F9242060430B4908188E -:108B3000C42106224254C021094A7A444250BD2130 -:108B400001224254D021074A7A444250CC21064A9D -:108B50007A444250204600F021F910BD1C1D00202F -:108B6000C21E000029F9FFFF29FFFFFF80B5FFF7B4 -:108B700085FF9D22002806D003498A5C102A02D373 -:108B8000B4220A238B5280BD1C1D002010B5044660 -:108B9000FFF7A8FF2420604304490818CC21044AA9 -:108BA0007A444250204600F0F9F810BD1C1D002008 -:108BB000C9FFFFFF70B50546FFF790FC0446124E53 -:108BC00030469C3020222946FCF77FFA687802283C -:108BD00004D0012809D1FFF7A3FA01E0FFF7C8FA92 -:108BE0000146002000290BD070BD9D20305CF02193 -:108BF000084205D00F21084080002058B82170504D -:108C00009C36304670BDC0461C1D0020B0B51749CB -:108C1000884211D01649884215D01649884222D17F -:108C2000F820154C2158E0256059401E884700283F -:108C300019D06059401E11E0E0200F490858FC226D -:108C4000895888470FE0F8200B4C2158E0256059DF -:108C5000401C8847002806D06059401C605120788D -:108C6000401E00F00BF80020B0BDC046030000809D -:108C700002000080010000801C1D0020F0B581B0C2 -:108C800004460120C6430C4D2F46E437F8202958EE -:108C9000E02028583018884701C7761C032EF5D1EC -:108CA0002046FFF7B9FC242060432818D021034A4E -:108CB0007A44425001B0F0BD1C1D002059FFFFFF57 -:108CC000B0B50446F8200B4D2950E0202B50FC2075 -:108CD0002A502046FFF7EAFBE435A84206D00649B1 -:108CE000794400222046FFF77BFBB0BD2046FFF70A -:108CF000C5FFB0BD1C1D0020EC1D000080B5002389 -:108D0000FFF7DEFF80BD0000B0B50C4D28780028CD -:108D100011D12846BC30002424222146FCF7EBF96F -:108D200028780C225043281810302146FCF7E3F92C -:108D30002878401C2870C0B2401EB0BD1C1D002009 -:108D4000F0B581B0144E3078AA2700281ED0401EFE -:108D50003070C0B2242460433018BC21475CBC3062 -:108D6000002529462246FCF7C6F930780C225043EC -:108D7000301810302946FCF7BEF93078002805D0AD -:108D8000444331199A2200238B5201E0777000206E -:108D9000401E01B0F0BDC0461C1D0020B0B5044609 -:108DA00012480278002A0ED0611C91420BD1242176 -:108DB00061434518FCF73EFCBE20002129522046A5 -:108DC00000F02AF8B0BD01210023002A0A4600D095 -:108DD0001A46641C00D019461143012904D1417878 -:108DE000AA2901D169214170B0BDC0461C1D0020D7 -:108DF00070B52424604307490E18FCF71BFC30466D -:108E0000BC30002529462246FCF775F9BC203554B4 -:108E100070BDC0461C1D0020F0B581B00446042082 -:108E2000FDF77EFC00283CD097283AD024206043F0 -:108E30001D490C18C02020582546C0352646BE3690 -:108E400000282ED02046CC300090C4343088AA2789 -:108E5000217880B2884224D2FDF72EFC002820D150 -:108E6000FDF7ACFBB84203D1FDF7D2FBB84218D1F5 -:108E7000286831884901401800990968002902D002 -:108E80008847002807D0012803D128683188490184 -:108E90004018FBF7A9F83088401C30802968002969 -:108EA000D6D101B0F0BDC0461C1D002000224308F1 -:108EB0008B4274D303098B425FD3030A8B4244D3A2 -:108EC000030B8B4228D3030C8B420DD3FF220902E4 -:108ED00012BA030C8B4202D31212090265D0030BA3 -:108EE0008B4219D300E0090AC30B8B4201D3CB0399 -:108EF000C01A5241830B8B4201D38B03C01A5241DB -:108F0000430B8B4201D34B03C01A5241030B8B42DC -:108F100001D30B03C01A5241C30A8B4201D3CB02C7 -:108F2000C01A5241830A8B4201D38B02C01A5241AC -:108F3000430A8B4201D34B02C01A5241030A8B42AF -:108F400001D30B02C01A5241CDD2C3098B4201D3C7 -:108F5000CB01C01A524183098B4201D38B01C01A45 -:108F6000524143098B4201D34B01C01A52410309BC -:108F70008B4201D30B01C01A5241C3088B4201D36B -:108F8000CB00C01A524183088B4201D38B00C01A18 -:108F9000524143088B4201D34B00C01A5241411A3F -:108FA00000D20146524110467047FFE701B500204C -:108FB00000F0F0F802BDC0460029F7D076E7704710 -:108FC00003460B437FD4002243088B4274D303092A -:108FD0008B425FD3030A8B4244D3030B8B4228D3CB -:108FE000030C8B420DD3FF22090212BA030C8B42F1 -:108FF00002D31212090265D0030B8B4219D300E091 -:10900000090AC30B8B4201D3CB03C01A5241830B15 -:109010008B4201D38B03C01A5241430B8B4201D3C5 -:109020004B03C01A5241030B8B4201D30B03C01AEE -:109030005241C30A8B4201D3CB02C01A5241830A68 -:109040008B4201D38B02C01A5241430A8B4201D397 -:109050004B02C01A5241030A8B4201D30B02C01AC1 -:109060005241CDD2C3098B4201D3CB01C01A524128 -:1090700083098B4201D38B01C01A524143098B42B1 -:1090800001D34B01C01A524103098B4201D30B019A -:10909000C01A5241C3088B4201D3CB00C01A5241BF -:1090A00083088B4201D38B00C01A524143088B4284 -:1090B00001D34B00C01A5241411A00D2014652411D -:1090C000104670475DE0CA0F00D04942031000D33C -:1090D0004042534000229C4603098B422DD3030A91 -:1090E0008B4212D3FC22890112BA030A8B420CD3A1 -:1090F000890192118B4208D3890192118B4204D3CA -:1091000089013AD0921100E08909C3098B4201D349 -:10911000CB01C01A524183098B4201D38B01C01A83 -:10912000524143098B4201D34B01C01A52410309FA -:109130008B4201D30B01C01A5241C3088B4201D3A9 -:10914000CB00C01A524183088B4201D38B00C01A56 -:109150005241D9D243088B4201D34B00C01A52412D -:10916000411A00D20146634652415B10104601D3BA -:109170004042002B00D54942704763465B1000D344 -:10918000404201B5002000F005F802BD0029F8D0EA -:1091900016E770477047C04610B5002200F00AF885 -:1091A00010BDC04610B500F031F810BD10B500F08C -:1091B0007FF810BD0B0010B511001A0000F0D4F8B4 -:1091C00010BDC04630B5032A0CD903000B439B07E2 -:1091D00019D103680C68A34215D1043A0430043154 -:1091E000032AF6D8551E002A0BD0002303E05A1C90 -:1091F0009D4206D01300C25CCC5CA242F7D0101B8B -:1092000000E0002030BD551EEFE7C046F0B5C64671 -:1092100000B50F2A41D903270D003E0005430C007D -:1092200003002E402F423DD11500103D2D09AC46C4 -:109230002D01A8468044256867681D605F60A568A9 -:10924000E7689D60DF6010341F0010334745F2D19E -:1092500065460F230C2401352D014919134045198A -:10926000144222D08C59AC5104369C1B032CF9D8E3 -:109270000324043B9B0801339B002240ED18C918CE -:10928000561E002A06D00023CC5C1A00EC54013391 -:109290009642F9D180BCB846F0BD0500561E002AA2 -:1092A000F1D1F7E70500561EEDE71A00F6E7C046D4 -:1092B000F0B5C64600B588420CD98B18984209D241 -:1092C000531E002A03D0CA5CC254013BFBD280BCAF -:1092D000B846F0BD0F2A0BD80500561E002AF6D05E -:1092E0000023CC5C1A00EC5401339642F9D1EEE72E -:1092F00003270D003E0005430C0003002E402F42C3 -:109300002CD11500103D2D09AC462D01A8468044F6 -:1093100025681F001D6065685D60A5689D60E56843 -:109320001034DD6010334745F2D165460F230C241D -:1093300001352D01491913404519144211D08C599A -:10934000AC5104369C1B032CF9D80324043B9B0826 -:1093500001339B00ED18C9182240BEE70500561ED8 -:10936000BEE71A00B9E7C046F0B5050083074AD04A -:10937000541E002A44D003000322CEB202E001357D -:10938000013C3DD301332E701342F8D1032C2FD969 -:10939000FF220A40150215432A0415430F2C35D924 -:1093A0002700103F3F093E01B4461E001A00103648 -:1093B0006644156055609560D5601032B242F8D1B0 -:1093C0000F260C2201373F012640DB1937002242CD -:1093D00017D03E1FB608B400A4461A001C1D6444F2 -:1093E00020C2A242FCD103240136B6009B193C40A6 -:1093F000002C05D0C9B21C19197001339C42FBD155 -:10940000F0BD3400F4E714000300BFE72700E0E7F5 -:10941000F0C041464A4653465C466D4676467EC09D -:109420002838F0C80020704710307CC89046994614 -:10943000A246AB46B54608C82838F0C8081C00D17B -:1094400001201847024670B50A4392072AD11E4DE3 -:10945000EE0104C808C9541B9443344017D0D0B25D -:10946000D9B2401A2106014310D190B299B2401AE4 -:10947000210401430AD110021902000A090A401A04 -:109480002102014302D1100E190E401A70BD9A42FA -:10949000DFD010BA19BA884201D9012070BD00206E -:1094A000C04370BD02780B7801300131002A09D029 -:1094B0009A4207D102780B7801300131002A01D09D -:1094C0009A42EFD0D01A70BD0101010103000A7861 -:1094D00001311A700133002AF9D1704710B58307A2 -:1094E0000AD00300032102E001330B4205D01A78B1 -:1094F000002AF9D1181A10BD030019680C4A0D4C46 -:109500008A188A4322420FD15968094A04338A18BB -:109510008A43224208D15968054A04338A188A438B -:109520002242F1D000E001331A78002AFBD1E1E7B2 -:10953000FFFEFEFE8080808030B5002A28D0030028 -:109540000B439B0713D1032A11D9134D0BE0043AA7 -:10955000002A1DD0114C1C199C432C4218D10430F8 -:109560000431032A03D903680C68A342EFD00478BE -:109570000D78A5420ED1012A0AD0012306E0C45C71 -:10958000CD5CAC4206D101339A4201D0002CF6D119 -:10959000002030BD601BFCE780808080FFFEFEFE67 -:1095A000F0B50C00044303000600A40712D1032AFF -:1095B00010D9144CA44666460D68134C1F002C1994 -:1095C000AC4334421CD10433043A1E0004313D60E4 -:1095D000032AF0D80024B71806E00D5D013A35558E -:1095E000BB1A0134002D02D0002AF6D1F0BD0021B3 -:1095F000D418002AFAD0197001339C42FBD1F5E748 -:109600001E00E7E780808080FFFEFEFE30B505008B -:1096100008002B006C18002903D106E001339C429E -:1096200003D01A78002AF9D1581B30BD253038589C -:10963000001976A91488AC17A914873DA9148720AE -:109640009EC9845ACB02FAB24E1C0368B3B517C147 -:10965000A4488FBA97F0E3459AC053EA010000008E -:1096600003C01F02B41600142200203F76A91488FC -:10967000AC209EC9845ACB02FAB24E1C0368B3B523 -:1096800017C1A4488FBA97F0E3459AC053EA010086 -:10969000000003C01F02B425750031323334353663 -:1096A00037383941424344454647484A4B4C4D4E72 -:1096B000505152535455565758595A616263646514 -:1096C000666768696A6B6D6E6F70717273747576B8 -:1096D0007778797A205369676E6564204D65737376 -:1096E0006167653A0AE0E0E0E0E0E0E0E0E0E0E069 -:1096F000E0E020222426404244484A4EC0C41601DD -:10970000010001010101010101000000DD17D0C0CD -:10971000191DD0C07103D0C01917D0C0C105D0C069 -:109720001D04D0C05D12D0C04D14D0C09D10D0C05B -:10973000A91CD0C0E503D0C02503D0C05502D0C0BD -:10974000626974636F696E636173680071707A72C5 -:1097500079397838676632747664773073336A6E35 -:1097600035346B686365366D7561376C0050656EB6 -:1097700064696E67004C656467657220726576691E -:10978000657700000300000000008000200000005A -:109790000100000000000000FFFFFF0000000000CB -:1097A00000000000070100000C0080002000000005 -:1097B00000000000FFFFFF00000000000880000024 -:1097C0006D97D0C007010000180080002000000045 -:1097D00000000000FFFFFF00000000000880000004 -:1097E0007597D0C000000000FFFFFF000000FEC121 -:1097F000FF3030EC0D03C3DE3030EC0D03C3C0F09E -:109800003FF80700000000000E0000000E000000FE -:1098100001000000E497D0C0EC97D0C00000000029 -:10982000FFFFFF00000000000C400BF807FCC0F336 -:10983000F03CF003FE012D000300000000000000DA -:109840000E0000000E000000010000001C98D0C0B7 -:109850002498D0C000000000FFFFFF00008001E658 -:10986000C071383807FC001E8007F003CEC1E13814 -:1098700070061800000000000E0000000E0000003E -:10988000010000005498D0C05C98D0C000000000D7 -:10989000FFFFFF00000000000C8007F003FEC1FF87 -:1098A000F03FF003CC0033C00C00000000000000CB -:1098B0000E0000000E000000010000008C98D0C0D7 -:1098C0009498D0C000000000FFFFFF004111050187 -:1098D000070000000400000001000000C498D0C090 -:1098E000CC98D0C000000000FFFFFF000000000087 -:1098F0001EE01F1C0E03638C19630C0C87837F8092 -:1099000007000000000000000E0000000E00000034 -:1099100001000000E498D0C0EC98D0C00000000026 -:10992000FFFFFF004812420804000000070000008B -:10993000010000001C99D0C02499D0C00000000094 -:10994000FFFFFF0021842401040000000700000045 -:10995000010000003C99D0C04499D0C00000000034 -:10996000FFFFFF00088A280807000000040000002D -:10997000010000005C99D0C06499D0C000000000D4 -:10998000FFFFFF00000000000000C000380067E09B -:10999000381C9C037E000F800100000000000000C6 -:1099A0000E0000000E000000010000007C99D0C0F5 -:1099B0008499D0C000000000FFFFFF0000003000CD -:1099C0000C80072001CC0033E01C3807FFC3F3F8FC -:1099D0007CFE1F00000000000E0000000E000000D2 -:1099E00001000000B499D0C0BC99D0C04175746F1B -:1099F00020417070726F76616C004D616E75616CA4 -:109A000020417070726F76616C004261636B005030 -:109A100075626C6963206B657973206578706F720D -:109A200074004170706C69636174696F6E00697372 -:109A30002072656164790053657474696E677300A0 -:109A400056657273696F6E00312E352E3300517575 -:109A50006974005369676E006D65737361676500B3 -:109A60004D65737361676520686173680043616E5B -:109A700063656C007369676E617475726500526529 -:109A800076696577007472616E73616374696F6E75 -:109A900000416D6F756E740041646472657373008C -:109AA000466565730041636365707400616E642090 -:109AB00073656E640052656A656374004F505F534E -:109AC000454E44455200436F6E6669726D0054689E -:109AD000652064657269766174696F6E0070617487 -:109AE0006820697320756E757375616C210044651B -:109AF0007269766174696F6E207061746800526576 -:109B00006A65637420696620796F75277265006ED7 -:109B10006F74207375726500417070726F76652086 -:109B200064657269766174696F6E00417070726FFE -:109B3000766500436F6E6669726D20746F6B656E3B -:109B4000004578706F7274007075626C6963206B89 -:109B500065793F00546865206368616E67652070B1 -:109B600061746800697320756E757375616C00436C -:109B700068616E6765207061746800546865207361 -:109B800069676E2070617468005369676E20706148 -:109B9000746800556E766572696669656420696EE1 -:109BA000707574730055706461746500204C656451 -:109BB000676572204C697665006F722074686972FF -:109BC000642070617274790077616C6C65742073C5 -:109BD0006F66747761726500436F6E74696E756548 -:109BE00000554E4B4E4F574E005245574152440080 -:109BF0004F505F53454E4445525F43524541544593 -:109C0000004F505F435245415445004C0E968C0026 -:109C100044656C656761746520746F202573202826 -:109C200066656520256420252529003D666E8B002C -:109C30003031323334353637383941424344454682 -:109C40000043616C6C20636F6E74726163742025D5 -:109C500073006F6D6E69004F4D4E4920005553449F -:109C60005420004D41494420004F4D4E492061731E -:109C70007365742025642000252E2A482E2E2E255B -:109C80002E2A48006F757470757420232564005166 -:109C900074756D005154554D00716300EC99D0C03E -:109CA000FA99D0C00A9AD0C00F9AD0C00A9AD0C0F0 -:109CB000229AD0C02E9AD0C09D85D0C0B09CD0C072 -:109CC0000000000000000000893ED0C0000000003D -:109CD0000000000000000000C89CD0C0FFFFFFFF94 -:109CE0004098D0C0379AD0C0318AD0C0E09CD0C054 -:109CF000D89CD0C000000000409AD0C0489AD0C084 -:109D00005185D0C0F89CD0C00000000000000000C9 -:109D1000A53ED0C0000000000000000000000000D0 -:109D2000109DD0C0FFFFFFFFB098D0C04E9AD0C0AA -:109D3000318AD0C0289DD0C0209DD0C00000000036 -:109D4000B89CD0C0E89CD0C0009DD0C0309DD0C091 -:109D5000FDFFFFFFFFFFFFFF0898D0C0539AD0C060 -:109D6000589AD0C08D8BD0C0589DD0C00000000044 -:109D700000000000609AD0C0001800205189D0C0B7 -:109D8000749DD0C00000000000000000AF3ED0C0B5 -:109D90000000000000000000000000008C9DD0C00A -:109DA000FFFFFFFFA099D0C0539AD0C0589AD0C0EF -:109DB000218BD0C0A49DD0C09C9DD0C000000000CD -:109DC000BD3ED0C000000000000000000000000008 -:109DD000C09DD0C0FFFFFFFF7898D0C06D9AD0C063 -:109DE000749AD0C0218BD0C0D89DD0C0D09DD0C097 -:109DF00000000000649DD0C07C9DD0C0B09DD0C04C -:109E0000E49DD0C0FFFFFFFF0899D0C07E9AD0C06C -:109E1000551800208D8BD0C0089ED0C000000000D7 -:109E200000000000919AD0C0411800205189D0C094 -:109E3000249ED0C00000000000000000989AD0C00E -:109E4000001800205189D0C03C9ED0C00000000006 -:109E500000000000CB3ED0C0000000000000000069 -:109E600000000000549ED0C0FFFFFFFFA099D0C0AB -:109E7000A59AD0C0318AD0C06C9ED0C0649ED0C09C -:109E800000000000DF3ED0C0000000000000000025 -:109E900000000000849ED0C0FFFFFFFF7898D0C074 -:109EA000B59AD0C0318AD0C09C9ED0C0949ED0C0FC -:109EB00000000000149ED0C02C9ED0C0449ED0C094 -:109EC000749ED0C0A49ED0C0FFFFFFFF0899D0C0F1 -:109ED000C69AD0C0859AD0C08D8BD0C0CC9ED0C041 -:109EE0000000000000000000A09AD0C0551800201B -:109EF0005189D0C0E89ED0C00000000000000000E2 -:109F0000F33ED0C000000000000000000000000090 -:109F1000009FD0C0FFFFFFFFA099D0C0A59AD0C07E -:109F2000AC9AD0C0218BD0C0189FD0C0109FD0C099 -:109F300000000000073FD0C000000000000000004B -:109F400000000000349FD0C0FFFFFFFF7898D0C012 -:109F5000B59AD0C0318AD0C04C9FD0C0449FD0C0E9 -:109F6000000000001B3FD0C0000000000000000007 -:109F700000000000649FD0C0FFFFFFFFA099D0C089 -:109F8000539AD0C0BC9AD0C0218BD0C07C9FD0C087 -:109F9000749FD0C000000000D89ED0C0F09ED0C0FA -:109FA000249FD0C0549FD0C0FFFFFFFFD89ED0C0D9 -:109FB000F09ED0C0889FD0C0549FD0C0FFFFFFFF4D -:109FC000D899D0C0CE9AD0C0DD9AD0C08D8BD0C0E9 -:109FD000C09FD0C00000000000000000EE9AD0C07A -:109FE000001800205189D0C0DC9FD0C000000000C4 -:109FF000000000002F3FD0C0000000000000000063 -:10A0000000000000F49FD0C0FFFFFFFF7898D0C091 -:10A01000FE9AD0C00F9BD0C08D8BD0C00CA0D0C0FA -:10A0200004A0D0C000000000A099D0C0189BD0C0F0 -:10A03000769BD0C08D8BD0C028A0D0C0000000007F -:10A0400000000000989AD0C0A82000205189D0C0FC -:10A0500044A0D0C000000000000000003D3FD0C080 -:10A060000000000000000000000000005CA0D0C064 -:10A07000FFFFFFFFA099D0C02B9BD0C0318AD0C07A -:10A0800074A0D0C06CA0D0C0000000004B3FD0C076 -:10A090000000000000000000000000008CA0D0C004 -:10A0A000FFFFFFFF7898D0C0B59AD0C0318AD0C0EA -:10A0B000A4A0D0C09CA0D0C000000000CC9FD0C005 -:10A0C000E49FD0C018A0D0C034A0D0C0FEFFFFFFD6 -:10A0D0004CA0D0C07CA0D0C0ACA0D0C0FFFFFFFF80 -:10A0E0004CA0D0C07CA0D0C0ACA0D0C0FFFFFFFF70 -:10A0F000593FD0C000000000000000000000000038 -:10A10000F0A0D0C0FFFFFFFFA099D0C0339BD0C00C -:10A11000A8200020218BD0C008A1D0C000A1D0C0B1 -:10A1200000000000673FD0C00000000000000000F9 -:10A130000000000024A1D0C0FFFFFFFF7898D0C02E -:10A14000B59AD0C0318AD0C03CA1D0C034A1D0C013 -:10A150000000000014A1D0C044A1D0C0FFFFFFFF49 -:10A16000753FD0C0000000000000000000000000AB -:10A1700060A1D0C0FFFFFFFFA099D0C0419BD0C01D -:10A18000489BD0C0218BD0C078A1D0C070A1D0C0D6 -:10A1900000000000833FD0C000000000000000006D -:10A1A0000000000094A1D0C0FFFFFFFF7898D0C04E -:10A1B000B59AD0C0318AD0C0ACA1D0C0A4A1D0C0C3 -:10A1C0000000000084A1D0C0B4A1D0C0FFFFFFFFF9 -:10A1D0000899D0C0549BD0C0649BD0C0218BD0C004 -:10A1E000D0A1D0C000000000000000006F9BD0C0D4 -:10A1F000001800205189D0C0ECA1D0C000000000A0 -:10A2000000000000913FD0C00000000000000000EE -:10A210000000000004A2D0C0FFFFFFFF7898D0C06C -:10A22000FE9AD0C00F9BD0C0218BD0C01CA2D0C042 -:10A2300014A2D0C0000000009F3FD0C0000000006A -:10A24000000000000000000038A2D0C0FFFFFFFFA8 -:10A25000A099D0C02B9BD0C0318AD0C050A2D0C012 -:10A2600048A2D0C000000000DCA1D0C0F4A1D0C042 -:10A2700028A2D0C058A2D0C0FFFFFFFF0899D0C0CD -:10A280007B9BD0C0649BD0C0218BD0C07CA2D0C0AF -:10A290000000000000000000899BD0C000180020D2 -:10A2A0005189D0C098A2D0C000000000000000007A -:10A2B000AD3FD0C000000000000000000000000022 -:10A2C000B0A2D0C0FFFFFFFF7898D0C0FE9AD0C0E8 -:10A2D0000F9BD0C0218BD0C0C8A2D0C0C0A2D0C01C -:10A2E00000000000BD3FD0C00000000000000000E2 -:10A2F00000000000E4A2D0C0FFFFFFFFA099D0C083 -:10A300002B9BD0C0318AD0C0FCA2D0C0F4A2D0C058 -:10A310000000000088A2D0C0A0A2D0C0D4A2D0C0AB -:10A3200004A3D0C0FFFFFFFFD899D0C0939BD0C03B -:10A33000318AD0C028A3D0C0000000000000000077 -:10A34000A59BD0C0AC9BD0C09D85D0C040A3D0C041 -:10A350000000000000000000B99BD0C0C89BD0C026 -:10A360009D85D0C058A3D0C00000000000000000B0 -:10A37000CD3FD0C000000000000000000000000041 -:10A3800070A3D0C0FFFFFFFF7898D0C06D9AD0C0F7 -:10A39000318AD0C088A3D0C080A3D0C00000000004 -:10A3A000DB3FD0C000000000000000000000000003 -:10A3B000A0A3D0C0FFFFFFFFA099D0C0D89BD0C002 -:10A3C000318AD0C0B8A3D0C0B0A3D0C00000000074 -:10A3D00030A3D0C048A3D0C060A3D0C090A3D0C049 -:10A3E000C0A3D0C0FFFFFFFF4F505F5245545552EE -:10A3F0004E000000556E64656C6567617465000011 -:10A4000000000000B001000000B0A7000000B00292 -:10A410000000003031323334353637383961626309 -:10A42000646566303132333435363738394142432A -:10A430004445466F00900167006985F1D000000037 -:10A44000004254430090009000006A805532465FFD -:10A4500056329000010990006E006D00FFFFFFFF73 -:10A46000000000000921110121012222000000004A -:10A4700009211101000122220006D0F10901A101E8 -:10A480000903150026FF0075089540810809041589 -:10A490000026FF00750895409108C006A0FF09013D -:10A4A000A1010903150026FF0075089540810809E0 -:10A4B00004150026FF00750895409108C0050F3966 -:10A4C00000021810050038B60834A909A0478BFD12 -:10A4D000A0768815B66500011E001C100500DF601F -:10A4E000DDD88945C74C9CD2659D9E648A9F00003B -:10A4F0000306B20077000000B17ED0C0C17ED0C09C -:10A50000D17ED0C0E17ED0C0F17ED0C0017FD0C06E -:10A51000117FD0C0217FD0C012034D0053004600F0 -:10A5200054003100300030007700280000000001A6 -:10A5300004000100000000000000020157494E55D0 -:10A540005342000000000000000000000000000076 -:10A5500000009200000000010500010088000000DA -:10A56000070000002A0044006500760069006300CF -:10A57000650049006E0074006500720066006100AD -:10A580006300650047005500490044007300000067 -:10A59000500000007B0031003300640036003300BF -:10A5A0003400300030002D00320043003900370005 -:10A5B0002D0030003000300034002D00300030001D -:10A5C000300030002D0034006300360035003600C6 -:10A5D00034003600370036003500370032007D0089 -:10A5E000000000000A00000000000306B20008009E -:10A5F00001000000A800080002000200A0001400F2 -:10A60000030057494E55534200000000000000006F -:10A6100000008400040007002A0044006500760062 -:10A6200069006300650049006E00740065007200F7 -:10A630006600610063006500470055004900440062 -:10A640007300000050007B004300450038003000DC -:10A6500039003200360034002D0034004200320050 -:10A6600034002D0034004500380031002D00410039 -:10A670003800420032002D0035003700450044000C -:10A680003000310044003500380030004500310012 -:10A690007D000000000000005D7CD0C08F7CD0C039 -:10A6A000C57BD0C00000000000000000B57DD0C018 -:10A6B000CD7DD0C0000000000000000000000000C0 -:10A6C0007D80D0C07D80D0C07D80D0C08D80D0C046 -:10A6D0003D7DD0C08F7CD0C0C57BD0C000000000C5 -:10A6E00000000000717DD0C0897DD0C00000000056 -:10A6F00000000000000000007D80D0C07D80D0C040 -:10A700007D80D0C08D80D0C0197ED0C0457ED0C0A5 -:10A71000497ED0C000000000000000004D7ED0C087 -:10A72000657ED0C0000000000000000000000000B6 -:10A730007D80D0C07D80D0C07D80D0C08D80D0C0D5 -:10A740001201100200000040972C010001020102DA -:10A750000301040309040E034C0065006400670054 -:10A76000650072000E034E0061006E006F00200055 -:10A7700053000A033000300030003100090260004D -:10A78000030102C032090400000203000002092193 -:10A790001101000122220007058203400001070584 -:10A7A0000203400001090401000203010102092122 -:10A7B0001101210122220007058103400001070544 -:10A7C00001034000010904020002FFFFFF02070528 -:10A7D0008303400001070503034000010A0600024D -:10A7E00000000040010000000300000000008000A5 -:10A7F000200000000100000000000000FFFFFF003B -:10A800000000000000000000050102000C00040030 -:10A810000700000000000000FFFFFF000000000034 -:10A82000000000002899D0C005027A000C00040046 -:10A830000700000000000000FFFFFF000000000014 -:10A84000000000004899D0C0071000000C008000F4 -:10A850002000000000000000FFFFFF0000000000DB -:10A860000880000000000000071100001A008000AE -:10A870002000000000000000FFFFFF0000000000BB -:10A8800008800000000000000300000000008000BD -:10A89000200000000100000000000000FFFFFF009A -:10A8A0000000000000000000050100000E0007008D -:10A8B0000400000000000000FFFFFF000000000097 -:10A8C000000000006899D0C0050278000E00070063 -:10A8D0000400000000000000FFFFFF000000000077 -:10A8E00000000000D098D0C00711000003008000D5 -:10A8F0002000000000000000FFFFFF00000000003B -:10A900000A80000000000000071200001300800011 -:10A910002000000000000000FFFFFF00000000001A -:10A9200008800000000000000713000023008000E2 -:10A930002000000000000000FFFFFF0000000000FA -:10A940000A800000000000002573202825642F25C0 -:10A9500064290025642F256400252E2A7300000039 -:10A960000300000000008000200000000100000043 -:10A9700000000000FFFFFF000000000000000000DA -:10A98000050102000C0004000700000000000000A8 -:10A99000FFFFFF0000000000000000002899D0C069 -:10A9A00005027A000C00040007000000000000000F -:10A9B000FFFFFF0000000000000000004899D0C029 -:10A9C0000510380002001000100000000000000018 -:10A9D000FFFFFF00000000000A80000000000000F0 -:10A9E000071100001C008000200000000000000093 -:10A9F000FFFFFF00000000000880000000000000D2 -:10AA000003000000000080002000000001000000A2 -:10AA100000000000FFFFFF00000000000000000039 -:10AA2000050102000C000400070000000000000007 -:10AA3000FFFFFF0000000000000000002899D0C0C8 -:10AA400005027A000C00040007000000000000006E -:10AA5000FFFFFF0000000000000000004899D0C088 -:10AA6000050F10000800100010000000000000009A -:10AA7000FFFFFF00000000000000000000000000D9 -:10AA8000071029000C0080002000000000000000DA -:10AA9000FFFFFF00000000000800000000000000B1 -:10AAA000071129001A0080002000000000000000AB -:10AAB000FFFFFF0000000000080000000000000091 -:10AAC0007D8CD0C0001E00200000000000000000AF -:10AAD000C0AAD0C0FFFFFFFF000000000000000080 -:10AAE0000000000000000000000000000000000066 -:10AAF0000000000000000000000000000000000056 -:10AB00000000000000000000000000000000000045 -:10AB10000000000000000000000000000000000035 -:10AB20000000000000000000000000000000000025 -:10AB30000000000000000000000000000000000015 -:04000005C0D0000166 -:00000001FF diff --git a/src/qt/res/ledger/nanos_delete.txt b/src/qt/res/ledger/nanos_delete.txt deleted file mode 100644 index 198238493d..0000000000 --- a/src/qt/res/ledger/nanos_delete.txt +++ /dev/null @@ -1 +0,0 @@ -python3 -m ledgerblue.deleteApp --targetId 0x31100004 --appName Qtum --rootPrivateKey fea057826208738ba33ff0e1ebb8ebf682ab73753afb2d988df03b1b59187d58 diff --git a/src/qt/res/ledger/nanos_load.txt b/src/qt/res/ledger/nanos_load.txt deleted file mode 100644 index d3496c03df..0000000000 --- a/src/qt/res/ledger/nanos_load.txt +++ /dev/null @@ -1 +0,0 @@ -python3 -m ledgerblue.loadApp --curve secp256k1 --tlv --targetId 0x31100004 --targetVersion="1.6.1" --delete --fileName :/ledger/nanos_app --appName "Qtum" --appVersion 1.5.3 --dataSize 64 --icon 010000000000ffffffffffffffffff1ffc0ff847f1a7f247f1a7f247f10ff01fe0fff7ffffffffffff --rootPrivateKey fea057826208738ba33ff0e1ebb8ebf682ab73753afb2d988df03b1b59187d58 --path "" --path "44'/88'" --path "45'/88'" --path "48'/88'" --path "49'/88'" --path "84'/88'" --path "0'/45342'" --path "20698'/3053'/12648430'" --appFlags 0xa50 diff --git a/src/qt/res/ledger/nanos_stake_app.hex b/src/qt/res/ledger/nanos_stake_app.hex deleted file mode 100755 index 3f6c19ced3..0000000000 --- a/src/qt/res/ledger/nanos_stake_app.hex +++ /dev/null @@ -1,2531 +0,0 @@ -:02000004C0D06A -:1000000010B5044662B604F0CDFD002C0DD00120E1 -:1000100000022168814205D1606801280AD1A068E8 -:10002000002803D104F08EFC02E0002004F0AEFCB6 -:10003000002010BD204604F02BFDF0B581B0044631 -:100040000020002A1CD00B780A2B19D89D0001260D -:100050003543954214D82370002B10D00096271DED -:100060004D1C002601210022284602F03BFA01C760 -:100070002D1D761C20788642F4D3009800E030468F -:1000800001B0F0BDF0B58DB04A484B4C0027275267 -:100090004120C0000090275401AE304608F08EFD8C -:1000A0000546B585A8B2002812D0102877D001A83F -:1000B00087850B9805F06EFF02203E49605240484C -:1000C0006F21017045700121204602F0CBFD58E000 -:1000D00001A805F05FFF0B90208802F0CAFD207890 -:1000E000002802D03548334D2FE0354A5078137838 -:1000F0000021364D7D44364E7E446F5CBB4202D1BA -:10010000775CB8420AD0491C0D29F6D36D20000255 -:10011000CBB20D210D2B274D01D116E0254D2D48D9 -:100120007844405C002809D08120830067200002C9 -:100130001279002A09D0E25A052A06D088002649F9 -:100140007944085805F06CFC80471E49605225210F -:100150004901615C00290CD0009BE15CEF220A4060 -:10016000E25409210903884203D05D21164A012384 -:100170005354615B020A124B5A545A185070881C2F -:10018000605305F0FBFE01A9884202D10B9805F0EF -:1001900001FF01A8808D002809D10DB0F0BD01A894 -:1001A00087850B9805F0F6FE102004F035FD04F06D -:1001B00033FDC046060200007C180020AA6F000034 -:1001C000E81F00200A020000001800200A8D00002D -:1001D000138D0000F88C0000E88C0000F0B581B0B1 -:1001E00018480024FF22214604F0F7FC412000902B -:1001F000C600154FBC5515483C525D241448015D9E -:10020000B85D252255017A5D002A06D0002904D068 -:10021000202108430099C90078540C49795A04F008 -:1002200045FF812189007852785D002806D0084872 -:10023000005D002802D0002005F06CFEFFF722FFD1 -:10024000DBE7C046E81F00207C1800200602000003 -:1002500000180020F0B581B0304C7C44204605F0F9 -:10026000DFFB808802F005FD204605F0D9FB808881 -:10027000C0B2254CFF2843D02948784405F0D0FB74 -:100280008088FF2108423BD0204804680546A088AA -:100290001F4F7870000A3870E088F870000AB87054 -:1002A000207A38710934204608F0AAFC02467A7197 -:1002B000B81D214604F07BFC2C682046093008F06C -:1002C0009FFC0546AE1D2734204608F099FCF1B28C -:1002D0007854EE1DF0B23D18204608F091FC02461D -:1002E0002846214604F063FC08480068273008F0DF -:1002F00087FC8019C0B20749074A505209200403FD -:10030000204601B0F0BDC04685690000201D0020D8 -:10031000E81F0020060200007C180020629B0000FD -:10032000429B000010B51148784405F079FB8079B4 -:100330000B490C4A082353520B4930224A700122C0 -:100340008A700523CB7003230B714A7100248C71D2 -:10035000CB7110401B2242400A700920000310BDDF -:10036000060200007C180020E81F0020949A00007C -:10037000B0B51A4C7C44204605F052FB808802F050 -:1003800078FC204605F04CFB8088C0B20F4CFF285B -:1003900019D01348784405F043FB8088FF210842B8 -:1003A00011D06B2004020A4DA87800280BD10D480B -:1003B000784405F035FB80880649074A01235352EB -:1003C0002870092004032046B0BDC046856900009E -:1003D000E81F0020060200007C180020489A000058 -:1003E000289A00000C9A000010B50720C0430A4963 -:1003F0000979002900D00846C4B267200002F82C11 -:1004000008D80548214605F079FC044804490C52F7 -:100410000920000310BDC046E81F002006020000AE -:100420007C180020F0B585B0524E3779564D7D448A -:10043000284605F0F5FA808802F01BFC284605F0F6 -:10044000EFFA8088C0B24C4C042800D98CE001251A -:10045000294681401620014200D185E00497B178F9 -:100460006B200702002080291ED000297FD1701D3B -:1004700000262946324602F035F86A023F49885084 -:100480007F2080000E5428020D543D20C0000E54E1 -:100490003B480E547B2080000E541F2000010E505C -:1004A0000E75CE77334E0420F178002935465ED1A3 -:1004B0000499091A7D229200304FB9542818401D22 -:1004C0003F21C90078500126304602F097FC0920F0 -:1004D0000203387D082849D100233B757F20800026 -:1004E0003946385CFB340028274640D02024684633 -:1004F0001F462B463033029318C008462830314639 -:1005000004923A463B4605F007FC08210391284631 -:1005100005F0F4FB322028706F702A1D029F3846C8 -:100520002146234605F024FC7002144E315828461B -:10053000243002F0B4F92846283031461531039AA8 -:1005400004F035FB1148784405F06AFA69460F60FB -:100550004C600830302321462A4605F019FC094832 -:1005600038213152049F02E0274600E01746B8B216 -:1005700005B0F0BDE81F0020856900007C18002050 -:100580008E040000060200008E990000769800009C -:10059000F0B59FB014460E4602AD69460D600121CC -:1005A00015AF1A463B4602F0FAF908354127002EEE -:1005B00003D1284601F056FD212741222046294635 -:1005C00004F0F5FA38461FB0F0BD0000F0B59DB05C -:1005D000C44E7E44304605F023FA8579BB4CA078A2 -:1005E0000D90304605F01CFA2927C05D01263540E4 -:1005F0000B95002500282A460AD0A07802282A4612 -:1006000006D1B348817901220020072900D0024693 -:100610000C92B548784405F003FAC05D0D9B012BA0 -:1006200029460DD00C990029294609D100282946D0 -:1006300006D0A74881790020072900D00646314618 -:100640000A910127012B384600D12846252149016E -:10065000A04A515CA04EFE36E278002903D0002863 -:1006600001D135462FE16B200502A078022800D980 -:1006700029E1022A11D3032A08D0022A00D022E15C -:1006800096480068406B002807D11CE19348006839 -:100690004021405C022800D015E167200502207946 -:1006A000002800D10FE1012B099202D1601D04F056 -:1006B000EBF808900C98002809D060798000801D24 -:1006C000C0B220180121002201F00CFF1C90874DC0 -:1006D0007D44284605F0A4F9808802F0CAFA28462D -:1006E00005F09EF97C49CD1C8088C0B2042800D951 -:1006F000E9E0012181401620014200D1E3E005F04C -:10070000CDFBAA28744D00D0DDE0651D2846394692 -:1007100002F0DEF90790412006902070671C14ABB0 -:1007200028460B993A46FFF733FF099B0546012BF4 -:1007300014D0032B10D1E9B20EAD38462A4602F090 -:10074000B6F800206946086022464332142132235D -:10075000284603F079F843E0022B34D10EA8142187 -:1007600004914170002105910170E9B2821C384664 -:100770001F46039202F09BF858480068022F17D1D9 -:10078000049F406B00282CD005F04AF901466846CA -:1007900007602746433700223846039B05F008FAD6 -:1007A0000546E8B201281CD1384608F029FA17E0BE -:1007B000C0886946086005984860224643320EA802 -:1007C000162196230AE045480068808800216A4681 -:1007D00003C2E9B2224643329623384602F096F825 -:1007E0000546422025540B98002801D10420607052 -:1007F000EFB2E5192846433014A9202204F0D7F9B6 -:10080000384663303649334B58520D98012830D062 -:10081000079800282DD00C98002847D02425585D33 -:10082000002808D0194620311CA8042204F0DEF963 -:10083000284B00283AD000265E55184620301CA9C7 -:1008400004221F4604F0B3F91C9B2046C83009253A -:10085000274A7A44294604F00FFFD02026540698F0 -:10086000C000395C10220A433A5404F02DF82D03DD -:1008700029E00D95322F354625D82046C83043341F -:1008800021463A461C4604F092F9C82000210D9AF0 -:1008900011540698C000215C10220A432254089883 -:1008A000C0B203F0FFFF092005030CE00920050397 -:1008B0000A98002807D00698C000195C10220A4345 -:1008C0001A5404F00BF8A8B21DB0F0BDE81F0020C8 -:1008D0003C2100207C18002082690000201D00209F -:1008E00006020000EA970000A8970000EC960000BE -:1008F000FA840000B0B5692300218522002807D0C2 -:100900000C480D49085A0D4941180B32002001E0EE -:1009100010461A468BB20A4CE2548A1C054B064D0F -:10092000EA52491C89B2605491B2202004F0BEFB07 -:10093000B0BDC046060200007C180020FEFF00008B -:10094000E81F0020F0B593B00920C701C24D002672 -:10095000EE51C24C285D02281FD0012800D078E15A -:10096000C84FEE51BE48295A002900D155E1BF4871 -:10097000285C0122FD2846D3FE283AD0FD2800D06D -:1009800067E1032900D248E1BF48295CA12080002B -:10099000285C00020843032235E0B14C295B092999 -:1009A00000D23AE1AF4BE85CFD22FC2801D80922D5 -:1009B0000EE0904200D04CE10B2900D22DE1AA4874 -:1009C000281800210A4601F069FDA64B295B0B227D -:1009D0001018884200D920E10A9000200126A3497E -:1009E0002A18525C401C002A21D100240728F7D97C -:1009F0002BE0052900D210E1A348281800210A465F -:100A000001F070FD0522E851022129558F21C9000E -:100A10006850964828188118914C16462A5B921BFC -:100A200004F0C5F8285B801B28530126F5E06918FF -:100A300011AC0822204601F0A8FF8D482818014675 -:100A4000224602F01FF9874B34460497EF183846C8 -:100A500001F032FE0590384601F0FCFB0790384665 -:100A600001F030FC02908348006840210391405C13 -:100A7000002111280891099108460FD17B2081009F -:100A80000691384601F03AFE09903846069901F081 -:100A90006DFE08903846069901F06DFE01903846CB -:100AA00001F032FC1F2211010691695802290ED86B -:100AB00000920390384601F07FFB07990843002815 -:100AC0000A9A3AD006982858012852D8C1E06948B5 -:100AD00000680399405C11280A9A07993B4614D193 -:100AE00018461F4601F068FB3B4607990A9A0843DF -:100AF00000280AD10898099B1843002C01D1059BB6 -:100B0000184300283B4600D1A3E05A480068039FE1 -:100B1000C05D11282DD001200021059A002A00D0A7 -:100B200008460443184601F047FB07990843012C87 -:100B30000A9A1ED100281CD18BE00898099B184303 -:100B4000002C06D00028BDD106982858002807D1CF -:100B50007FE0059B18430028B4D100980001285875 -:100B6000039B002B01D1012873D0002B01D1022857 -:100B70006FD00998089B0343002B6AD10598002881 -:100B8000049F3FD13C48285C00283BD0029B0B438C -:100B900004240320002B00D00446019808430028B9 -:100BA0000CD136482918E0B228182E4A8018142291 -:100BB00004F01CF807990A9A002838D03D20C0009C -:100BC00000291FD0285C00281CD009940BAC1422EB -:100BD000089262700020207028482918A01C03F099 -:100BE000E6FF16212046224601F061FE0998C0B2B8 -:100BF00028181C4940182146089A03F0F7FF0028DE -:100C00000ED00A9A06996858401C6850EA51412053 -:100C1000C000295C10220A432A54304613B0F0BDAC -:100C2000144800684421405C400712D50A9A1448D1 -:100C3000295C00290DD10121295406996858401CCE -:100C400068508F20C0002958491E2950002AE4D03E -:100C5000DFE6012003F0E0FF7C18002084040000A0 -:100C6000760400008A0200008B020000820200006D -:100C700085040000201D00207E0200006A020000A2 -:100C80008D0400007C0400008302000070B59EB05B -:100C90000C4601AD69460D600126002214AB3146B9 -:100CA00001F07DFE0948784404F0BAFE08358179E8 -:100CB0004120314203D1284601F0D4F9212081B2EC -:100CC0002846224601F0F3FD1EB070BD16910000CB -:100CD000F0B59FB0DE4A94786B210E021179002C9A -:100CE00004D0FF2C02D0802C00D098E10A90D94B80 -:100CF000D94F3D20C0000990385C0025002806919E -:100D000012D0F85C00280FD150790125FD21FD2873 -:100D10000AD34A1CD5B205220023A84200D01A46A5 -:100D20000325884200D015460BAE304607F046FF3B -:100D3000B085CA49084208D00BA8002181851598C2 -:100D400005F028F96F20060246E10BA805F022F90C -:100D50001590387DC24E092800D03AE10221C843DF -:100D6000801CC0B2844240D1787F002800D11CE1B1 -:100D70000520C401385D002800D12AE10025582251 -:100D80000A98294603F029FFB1494879002800D183 -:100D90000BE10A9E2336491D2922304603F007FF46 -:100DA000B64839183046FFF771FF3D55B04801216C -:100DB000395434463046AA4D01F038FE002800D19F -:100DC000F3E025204001385C00282E4600D000E1E9 -:100DD000A648042139544120C000395C10220A433E -:100DE0003A54204603F084FDDFE00791F5204000EF -:100DF0000890385C002813D1E8B206990B1A3446E3 -:100E0000FB36002B00DAE4E000216A4611605160F5 -:100E10008F4A1018421D3846283004F07DFF2646C0 -:100E2000787F00282FD08F4C385B069D4119FB3608 -:100E30007D229200914200D9CBE038188A494018AF -:100E40008349491D2A4603F0B2FE385B40193853E6 -:100E5000FFF778FD002804D04120C000385CC006B0 -:100E6000F6D58F20C000385800287D4E0BD1412088 -:100E7000C100795C1022114205D17C4B0324FC5443 -:100E80001143C00039540998385C714A917800299F -:100E900024D0002811D120206946486017A8086096 -:100EA000384694306A494A1D0121069B04F034FFFC -:100EB00067490998385C002850D00898385C0028A9 -:100EC00022D020206946486017A80860172000013A -:100ED0003A1838469430012160233CE000280BD1B9 -:100EE000002168460160416038469430584A521DDE -:100EF000069B04F011FF564A5F48012139525548BC -:100F000039540020107050E0202468461B2109014C -:100F1000791801600A46039244603D462835012154 -:100F2000049100230593284604F0F6FE284604F0B9 -:100F300013FF6846039A14C02846049D2946234699 -:100F400004F0EAFE6846446017A901603846943010 -:100F50003F4A2946059B04F0DFFE3D49787F002883 -:100F600029D04348385C002804D1002158220A982F -:100F700003F033FE3F48006801790A9C6170807974 -:100F8000A07020464C30082104F0B8FE3A4807997A -:100F9000395200202E4908704870787F002811D0FF -:100FA000E01C17A9202203F002FE159804F0F2FFBE -:100FB0000920060333E03048079A3A52002048706F -:100FC00008700A9CE11C17A8202201F059FC002897 -:100FD00028D0159804F0DEFF274C002038533875D0 -:100FE000204D7A5B20483918194803F0E0FD785B02 -:100FF000385304F0C3FF0BA9884202D1159804F0BE -:10100000C9FF1A4801213954164800243C521C4893 -:1010100038180822214603F0E0FD1A483C54B0B2CB -:101020001FB0F0BD0898385C7B218900795C0143D2 -:1010300009983A5C0A20002A05D0090603D101204C -:10104000089978540020387509200603D1E7C04676 -:10105000E81F0020810200007C180020FFFF000034 -:10106000856900007604000082020000840400000C -:101070007E020000201D0020060200006A0200001F -:10108000850400008D04000070B521200001134D7F -:101090002818FFF71DFE04464120C600A85DC006C3 -:1010A00019D50F48295C042904D0032905D103F080 -:1010B000ABFB04E0012129540DE003F07FFB002885 -:1010C00009D1084800212952A85DEF220240AA5503 -:1010D0002975D520C401204670BDC0467C1800206B -:1010E0008404000006020000F0B581B08F20C70024 -:1010F0003D4DE8593D4C295D022901D1401EE85182 -:1011000009210E030028009629D039482818CE015D -:10111000AA598118374C2B5B9A1A03F048FDA8593D -:10112000295B081A28534120C600A85DEF21014021 -:10113000A955FFF707FC002802D0A85DC006F8D526 -:10114000A85DC006009E294C09D503F037FB014677 -:101150000120002945D100202875D520C601295D30 -:1011600002290AD1E859002807D10320285503F0A5 -:101170004BFB002807D0295D0AE0320A0020009BC3 -:101180009E420CD12DE0002129552975D520C6019C -:1011900001200022009B9E4200D01046320A164FCA -:1011A000EB5B164CE2549A1CEA535B1C9BB2E65470 -:1011B000002801D003290FD101200C4968540D48A3 -:1011C00000242C520E4828180822214603F005FD61 -:1011D0000C482C5408482A5A91B2202003F066FF8C -:1011E000002001B0F0BDC0467C180020840400003F -:1011F000820200007604000006020000E81F0020C2 -:10120000850400008D040000F0B585B0744D2F7981 -:101210007C4C7C44204604F003FC808801F029FDCE -:10122000204604F0FDFB6F4EF21C8088C0B20428FB -:1012300000D9D2E0049701273946814016200142A7 -:1012400000D1CAE0A878684A7632802808D0002801 -:1012500000D0C2E03902654B03245C5400211975AB -:10126000EC788023052C59D8012C57D0002874D154 -:10127000581CC1B200208C4200D00746A01E02902C -:101280005A48407F002803930CD118462A30C0B238 -:101290000090019104F002FE0199009A90423246BA -:1012A00000D09AE07B208000504A13461F541F2034 -:1012B000000100221A5001208C4201461E4600D037 -:1012C0001146029BDBB2042B034600D3134619439D -:1012D0003D23DB00F1547077F283454909684023D0 -:1012E000CB5C444972540326744002265E40264378 -:1012F000002E00D01046FF263246EA323B49885481 -:101300001A2B14D8012098403B4A10420FD0E8789D -:10131000052808D004280AD1012005E0802C1CD023 -:10132000812CA3D059E00220324A304988543348F6 -:1013300000242E4F3C54F52040003C5430483818CF -:101340001822214603F049FCEC36BC550520C001AB -:1013500001213954EC78A878039B049FFF21EC31DC -:10136000224E3D22D2009C422BD0B25C002A28D0D3 -:10137000725C002A25D1984223D128790A38C0B25C -:1013800031281ED8687902281BD8012808D1A879ED -:10139000382805D1E879322802D1287A002810D0DF -:1013A00025204001305C00280F4A16D101207054DE -:1013B0004120C000315C10220A43325403F0B8FAD5 -:1013C000049F7D20800037543F20C000691D3150AC -:1013D000022001F013FD0920020390B205B0F0BD18 -:1013E000E81F0020826900008A6A00007C18002043 -:1013F000201D00208E040000800140048F040000A6 -:101400006A020000AA8B0000F0B593B0724C7C44D5 -:10141000204604F005FB808801F02BFC204604F0F8 -:10142000FFFA8088C0B2634F04283ED801252946C0 -:1014300081401620014238D05F4E6B200002B17807 -:10144000002902D0F178002930D1672000023179DB -:1014500007292BD305AC204607F0B0FBA0855749E0 -:10146000084208D005A8002181850F9804F092FD5C -:101470006F2007020EE005A804F08CFD0F90504984 -:10148000087D0A2803D1FB3770790B2811D30F98F8 -:1014900004F080FD4A480021017504F06FFD05A9A4 -:1014A000884202D10F9804F075FD384680B213B01F -:1014B000F0BD44480818741D29220490214603F009 -:1014C00076FB707980002843215C20184418601C4A -:1014D00000262946324601F005F8039064793A481F -:1014E00037490C543D48784404F09AFA8079042135 -:1014F00008420DD1354800684021415C022902D0E4 -:10150000816B002951D0412CC1D1806B0002044372 -:101510002F482B49085C00281DD111AD284603999E -:1015200001F0BDF9281D214601F0B9F97B208000AA -:101530002349085C002804D011A8082100F01AFEF5 -:1015400009E06846066046600846283011AA08236C -:10155000314604F0E1FB0021049D284601F0B8FA71 -:10156000002805D00120014600F03AF8144C09E0AB -:101570004120C000124C215C10220A43225428460C -:1015800003F0C6F925204001205C09210F03002843 -:1015900083D010488168491C81604268914200DA1A -:1015A0007BE75D210122425477E7012C2C46AFD026 -:1015B0006DE7C04685690000E81F0020FFFF0000BE -:1015C0007C1800203302000066020000201D00206D -:1015D0008E04000000180020AE890000D6880000AC -:1015E000F0B5B1B0002818D0039100216846016021 -:1015F0003448354C201827AB0A4601F0D0F97B203F -:101600008000205C00280FD02020694648601FAA77 -:101610000A604120800020180DE02D4B2A4A00204E -:10162000D052692285263BE02020694648601FAAE7 -:101630000A60204628300121002304F06DFB04AF2E -:10164000384604F089FB2025684645601FAE0660D9 -:1016500001243846214632462B4604F05DFB1E48E5 -:10166000784404F0DDF98079400820406946FF2283 -:1016700052320A60486027A8144C31462A46234655 -:1016800001F0C4FA6178C81C114A0F4B9852114AF4 -:101690009A5C61188A707A21CA430B32002603993A -:1016A00000290DD183B2094CE254821C084B064D2F -:1016B000EA52401C80B2265491B2202003F0F6FC7E -:1016C00031B0F0BD330200007C180020E81F00207C -:1016D00006020000660200005C870000F0B581B0E1 -:1016E00067200602284D287901282AD1284C7C44FD -:1016F000204604F095F9808801F0BBFA204604F0FA -:101700008FF98088C0B2214FFF2819D02148784432 -:1017100004F086F98088FF21084211D0FE1E04F0F3 -:10172000BDFBAA280DD16C791B48784404F078F9E8 -:10173000092109038088C0B2844205D10E4600E029 -:101740003E46B0B201B0F0BD3E46FB36082CF8D89C -:1017500000910120A0408B2149000842F1D00F4D9B -:101760007D44284604F05CF9408801F082FA28465E -:1017700004F056F9408820423E46E2D0204600F070 -:1017800079FC009EDDE7C046E81F00208569000067 -:10179000CE860000AE860000928600005C860000C7 -:1017A0006D20000270470000F0B58BB009AD00213C -:1017B00006262846324603F010FA0A200A99014309 -:1017C000297101242846214601F04CFA02202843C1 -:1017D000214601F047FA124F7F44384604F020F9C1 -:1017E000801C2946324604F07BFA6D4620262846A6 -:1017F000314604F083FA384604F012F908302946DD -:10180000324604F06DFA08AD2C70384604F008F941 -:10181000401C2946224604F063FA0BB0F0BDC046D6 -:10182000E4850000F0B581B0017800250091002921 -:1018300018D0441C002701250026204629463246A0 -:1018400000F050FE80B2094988420BD00849884216 -:1018500007D0241D7F1CF8B2009988423546EAD390 -:1018600000E00225E8B201B0F0BDC0461DB10000A5 -:101870001EB10000F0B599B0A94EB778802038436A -:101880006B210D02802800D040E130790B90F47874 -:10189000002F04D1022C02D3802C00D036E1D520B9 -:1018A000C5010C95FE3D04F0F9FAAA2800D02DE1FF -:1018B0000DAD284607F082F9A8859A49084208D05C -:1018C0000DA800218185179804F064FB6F200502A4 -:1018D0000CE10DA804F05EFB1790002F26D04D21DF -:1018E000CA00914C99218D00615B002900D1FAE07A -:1018F000A25A8A4200D0F6E0084600F077FF00289E -:1019000000D1EFE0625B894820187D21890000F05A -:1019100079FF002800D1E5E085482018FFF782FF15 -:10192000002873D000F00EF90546E7E0012C27D817 -:10193000212000017C4D281800275822394603F049 -:101940004CF970790B2800D3CCE07B480068017912 -:101950007A4AA95480797A49685475482818711DC3 -:10196000292203F024F970798000012101437218C3 -:101970005079002C56D0927900021043072252E091 -:1019800099218D00684C615B4D22D700E25B0B9B77 -:10199000D2188A4200D9A6E0084600F027FF0028A6 -:1019A00000D19FE021460024684604604460084658 -:1019B0002830721D0492214605950B9D2B4604F09C -:1019C000ABF9684604604460574894302146049A55 -:1019D0002B4604F0A1F95449C85B08185349401834 -:1019E00004992A4603F0E3F84F4BD85B4019D853CB -:1019F00034700599595A82B2092005034D48914225 -:101A000000D086E002211952747063E04120C000CA -:101A1000215C10220A432254179804F0BBFA0920D3 -:101A2000050373E0062299239C0028538918002897 -:101A300058D0079100F0DAFE002853D04D200894CA -:101A4000C4000A972F532F462835284604F084F9FE -:101A500038469430069004F07FF90994385B089C6E -:101A60000B99491D079A891ACBB21818395B88421D -:101A700038D868460A9F07604760B2180392284624 -:101A800039461D4604F048F96846076047600698E5 -:101A90003946039A2B4604F03FF923480146099C36 -:101AA000085B08182149401803992A4603F07FF87B -:101AB0001D49085B281808530A4637700899515A7F -:101AC00082B2092005031B48914225D10221164B01 -:101AD00019527770154818187D21890000F092FE80 -:101AE00000280BD1179804F055FA0C9D2120000115 -:101AF0000D4908180021582203F06FF804F03EFA4F -:101B00000DA9884202D1179804F044FAA8B219B07E -:101B1000F0BD01211952F1E70121034A1152EDE70D -:101B2000E81F0020FFFF00007C1800208202000058 -:101B30003302000006020000201D002011020000F8 -:101B400012020000F0B5A1B03748384F00243C52D3 -:101B500003AD284607F032F8A8853549084207D07A -:101B600003A884850D9804F015FA6F20040242E062 -:101B700003A804F00FFA0D902021029168464160FD -:101B800019AE0660294F28370125384629463246C6 -:101B9000234604F0C1F8384604F0DEF868460660D3 -:101BA000029B436038462946324604F0B5F8684641 -:101BB000046020481D4908180FAF214622463B46C5 -:101BC00000F0EDFE1D48784403F02AFF80794008BC -:101BD0002840694664220A604860174C3846134F13 -:101BE0003146029A234601F011F86078801C0E49B4 -:101BF00078520920040304F0C1F903A9884202D1F4 -:101C00000D9804F0C7F9212000013818002158224E -:101C100002F0E3FF03A8808D002802D1204621B006 -:101C2000F0BD02F0F9FFC046060200007C1800205B -:101C3000FFFF000033020000E81F0020F6810000D3 -:101C400070B525204001094D285C002801D0084CC2 -:101C500009E04120C600FFF70DFE0446A85DC0065E -:101C600001D502F009FE204670BDC0467C18002058 -:101C700082690000B0B5014669228520002902D0A2 -:101C8000FFF760FF020A0749074B5C5A074D2A55C8 -:101C9000A21C5A52611C89B2685491B2202003F0F0 -:101CA00005FAB0BD060200007C180020E81F0020E5 -:101CB0006D20000270470000F0B589B01E4617463F -:101CC0000A460024E543782A00D987E0002A06D096 -:101CD0000024015D002902D1641C9442F9D30490D0 -:101CE000111B8A2048436421069206F0B5FC034686 -:101CF0005A1C306898423FD9019602950021384617 -:101D00000092059302F069FF059B039406988442B4 -:101D100026D21946039A04980792805C491E0891BE -:101D20001C46395D09020E183D463A2730463946B1 -:101D300006F01CFD4743F11B2F46395539360899EB -:101D40008C4201D8732E04D3611E002C0C46E8DCB3 -:101D500000E02146079A521C06988242059BDAD180 -:101D60000021039A029D019E785C002806D1481C40 -:101D700099420146F8D302E032602FE0084600990C -:101D80008918091A336831608B4227D3131A002B44 -:101D900010DB481E0028059B19DB134878447C188B -:101DA0001E46BB5DC35C635533465B1E491E00295E -:101DB000F5DC0CE08A420AD20A49794414463B5CBD -:101DC000CB5C3B55401C641C33689C42F7D30748EE -:101DD00078440178384602F000FF0025284609B013 -:101DE000F0BDC0460A70000028700000F46F0000CB -:101DF000F0B595B000920F4602900AAC2A21204619 -:101E000006F0A0FD022004430594790001400D2254 -:101E10000A4303924140881D019013250021029836 -:101E20000491405C0690002107200991401A01218D -:101E300008918140069801400791ECB2142C0ED80D -:101E40001520021B60000AA90E183188C81C04293D -:101E500000D808463080521EB61C002AF5D160001A -:101E60000AA9085AFF34072800D82C46E0B21328E4 -:101E700017D814210D1A400005990A180AA90E5AFC -:101E8000138801210027072B084600D83846760022 -:101E90000E2737400743C8431752921C6D1E1E463B -:101EA000EED107980028089A00D102461498400005 -:101EB0000E21014011430AA801850999491C0829EE -:101EC0002546B1D10499491C08292546A7D10021EE -:101ED0000B460A460C46009ED8B240000AAD285A6E -:101EE000240603D1002801D10C4604E0D4B23030DE -:101EF0003055521C01245B1CD8B2039D8542EBD89F -:101F00001106019D02D130213170012200242146A9 -:101F1000CEB2B5420D4622D9361876000AAFBE5B66 -:101F20006D1C002E04D1EEB2019FB742F4D816E02A -:101F30002506009F04D1D4B22E253D55521C012404 -:101F4000DDB26D000AAE755B3035D6B2BD55521CA0 -:101F50005B1C491CCDB2019EAE423546D8D8D0B2EA -:101F600015B0F0BD80B583218900044A5258044958 -:101F70000968496CFFF73CFF80BDC0467C18002013 -:101F8000201D0020F0B583B02B4D00262B4A28469B -:101F9000314602F022FE2846314600F063FE284812 -:101FA0002E52252040012E54264801242C54264828 -:101FB00028180822314602F010FEFF20EC302E5483 -:101FC00022482E542248784403F02AFD4078012804 -:101FD00001D0FFF7E9FB1F48784403F021FD40786A -:101FE000002807D01C48784403F01AFD808800F0D0 -:101FF00040FE02E0FF2000F03DF81848784403F06E -:102000000FFD0078002814D102AD2C7001AE3470A1 -:10201000134F7F44384603F003FD293031462246F2 -:1020200003F05EFE384603F0FBFC2946224603F02F -:1020300057FE03B0F0BDC0467C180020A404000089 -:102040007604000084040000850400008D04000074 -:10205000F67D0000E47D0000D67D0000C07D00001C -:10206000AA7D00004021415C01220A400221114367 -:102070000170704710B582B0014601AC204600F0F7 -:10208000F1FD0548784403F0CBFC001D02222146F7 -:1020900003F026FE02B010BD387D0000F0B58DB013 -:1020A00007464120800032490D180C46284603F0AF -:1020B00053FE00266846066046607720800022189E -:1020C00004232846314603F027FE68460660466032 -:1020D000172000012218202428463146234603F009 -:1020E0001BFE6846066046601920000120490A1858 -:1020F00028463146234603F00FFE0C960B960397B5 -:1021000008377D2084000CAA0BAB3846214600F02E -:102110000DFA002828D00B980C9900266A46166004 -:1021200056600B18083328463146039A03F0F4FD35 -:1021300004AA3846214600F023FB002813D0684645 -:102140000660466004AA1A232846314603F0E4FDDF -:10215000684606604660082328463146039A03F025 -:10216000DBFD012600E0002630460DB0F0BDC04684 -:102170007C180020F0B583B00C4605460026684662 -:1021800006604660412080000A490F181B200001AC -:102190000A1820233846314603F0BEFD6846066023 -:1021A0004660384631462A46234603F0B5FD03B063 -:1021B000F0BDC0467C18002070B504461E4E306845 -:1021C000416B002911D01D4979440322204602F0B9 -:1021D0000DFD012500282CD0194979440322204601 -:1021E00002F004FD002824D030684021405C132810 -:1021F0000CD1144979440422204602F0F7FC00284F -:1022000016D118341049794428220BE00F4979443B -:102210000422204602F0EAFC002809D118340C49B7 -:1022200079440222204602F0E1FC0125002800D07A -:102230000025284670BDC046201D0020BD6B000053 -:10224000AE6B0000976B0000896B0000436B0000D1 -:10225000356B0000B0B50446154800684021405C6D -:10226000132810D1134979440322204602F0BEFC02 -:1022700000281AD11734104979442722204602F049 -:10228000B5FC01250FE00D4979440322204602F0F8 -:10229000ADFC002809D117340949794401252046AD -:1022A0002A4602F0A3FC002800D000252846B0BD35 -:1022B000201D0020F56A0000E66A0000CF6A0000D9 -:1022C000C06A0000B0B504460C480068406B0028A6 -:1022D00010D00B4979440322204602F087FC0125E7 -:1022E000002808D0074979440322204602F07EFCEA -:1022F000002800D000252846B0BDC046201D002083 -:10230000B16A0000A26A0000B0B504461B497944D6 -:10231000032202F06BFC002809D120462330184923 -:10232000794401252A4602F061FC002824D0154991 -:1023300079440322204602F059FC002809D12046A6 -:1023400023301149794401252A4602F04FFC002828 -:1023500012D00E4979440322204602F047FC00289F -:1023600009D143340A497944012520462A4602F01E -:102370003DFC002800D000252846B0BDA96A000019 -:10238000A06A00008A6A00007C6A0000696A000096 -:102390005A6A0000F0B586B0FF2414700468002764 -:1023A0008C421AD20B9E002B01D000241C60002E00 -:1023B00001D00024346005684C1B012C0DDB059214 -:1023C0002A46551C056014784E2C5FD804954C2C79 -:1023D000039704D22746049D45E03C4659E0002778 -:1023E0004E2C26D04D2C0DD04C2CF4D102943746D7 -:1023F000049C0E1B0024012E3E464ADB951C056002 -:1024000057782FE002940196049C0E1B0024022EA4 -:1024100015463EDB009300231C461F46049AD65CFB -:10242000E4B2A640F7195B1C0834022BF7D1ED1C6F -:1024300015E002940196049C0E1B0024042E154600 -:1024400027DB0093002423462746049A165DDBB25F -:102450009E40F719641C0833042CF7D16D1D0560EC -:10246000009B019E029C491B002915DB0495254613 -:10247000B942039C0DD3002B01D004991960002EA2 -:102480002C4600D037600168C919016005980470B6 -:102490000124204606B0F0BD039CFAE7F0B581B0F8 -:1024A00000920722D34308240029224600D01A466E -:1024B000002900D10C4600252946465D7F2737407C -:1024C000002D334600D13B46009F002F00D01E4612 -:1024D000E3B29E4071189C186D1C022DEDD1084688 -:1024E00001B0F0BDF0B581B000920722D3430822BD -:1024F000002900D01A461824002900D10C460025D6 -:102500002946465D7F273740002D334600D13B46A4 -:10251000009F002F00D01E46E3B29E4071189C1809 -:102520006D1C042DEDD1084601B0F0BDF0B5044698 -:1025300000201060186000291FD02578FD26FC2D92 -:1025400001D8012710E0032917D3B54215D1601C2B -:10255000002426462546075DF6B2B7407D19641C67 -:1025600008360327022CF6D115601F601068C319C6 -:10257000012000228B4200D91046F0BDF0B585B095 -:10258000144602460020FD26002B029608D00023A8 -:1025900000291BD01578B54205D201212B4616E043 -:1025A0000B46014613E0032910D3B54219460ED15C -:1025B000561C00252F462B46715DFFB2B940CB1843 -:1025C0006D1C08370321022DF6D100E01946029D4B -:1025D000AD1C04AE357055180395D2185518002B54 -:1025E00017D0002637466846066003A804AA294685 -:1025F0003346FFF7CFFE00280AD004A80178781CE4 -:10260000A14200D038460399A9420746EBD100E029 -:10261000384605B0F0BDF0B585B002920027FD2226 -:10262000002B08D0002300291BD00478944205D247 -:102630000121234616E00B46394613E0032910D347 -:10264000944219460ED1441C00252E462B46615D4E -:10265000F6B2B140CB186D1C08360321022DF6D11D -:1026600000E01946921C04AC227042180392C01874 -:10267000451802980128019716DB002B019F13D003 -:102680000B9C0A9E00276846046003A804AA2946FA -:102690003346FFF77FFE002806D07F1C0298874252 -:1026A00002DA0398A842EED1012002998F4200D0AD -:1026B000019805B0F0BD000070B501464A780123CD -:1026C00000246A2A184600D020460B4D2D6840266B -:1026D000AD5D022D00D023461843022D0AD16A2A8F -:1026E00008D00020002A05D18A78012000216A2A1A -:1026F00000D0084670BDC046201D002080B5C12214 -:1027000000F002F880BD0000F0B581B015460E461D -:102710000746FFF751FD0024002804D13846FFF793 -:1027200099FD002802D0204601B0F0BD0E48006897 -:102730004021405C7978022807D16A2905D0002918 -:1027400007D1B8786A28EED003E06A29EBD00228D6 -:10275000E9D00123384631462A46FFF70FFF00240F -:102760000128E0D10446DEE7201D002080B5C2220A -:10277000FFF7CAFF80BD80B5C422FFF7C5FF80BD4B -:10278000F0B585B0144600270497039703AA6B465B -:102790005A6004AA1A60022201263346FFF73BFF63 -:1027A00001283D4600D1054604990029304600D154 -:1027B000084605400398142800D03E463540002DB9 -:1027C00011D076206070192020701422E2707720DA -:1027D000C64330462130A070201D02F0E8F92436AF -:1027E000667688202076284605B0F0BD0146012097 -:1027F0000023F629024600D01A46B42900D0184614 -:1028000010437047B0B501240023F62A254600D0B6 -:102810001D46B42A00D01C462C438A422BD8002CDB -:1028200029D0F62A03D1B421415C412923D10022C9 -:1028300044231146C45CD2B2944061185B1C083238 -:10284000482BF7D100238A0715D100234C241A46C0 -:10285000055DDBB29D40AA18641C0833502CF7D1EB -:10286000064B012000249942034600D82346002A43 -:1028700000D0204603401846B0BDC0465BAC826025 -:1028800070B50023002A08D00023521E94B2055DC3 -:102890000E5D6E403343002CF7D1D8B270BD01708D -:1028A0000A0A42700A0C8270090EC1707047F0B5B6 -:1028B000A3B0164603AC202522462B4603F058FA57 -:1028C0000BAF384603F03CFA142069460E604860AE -:1028D0000121384622462B4603F01EFA23B0F0BDF4 -:1028E00070B588B014466D4620262A46334603F05C -:1028F0003FFA284631462A46334603F039FA042285 -:102900002046294602F053F908B070BDF0B58BB0EF -:102910001D4614460346109E02270120FF2E00D8B4 -:1029200007461198002808D014203843C2B202A8E4 -:10293000194602F03CF9FFB20EE0FFB202A8C2193C -:102940001846FFF7B4FF300A04D002A84670310AD7 -:10295000017001E002A806701421394302AEF21999 -:1029600014323046FFF7BCFF01951821394301AB03 -:1029700030462246FFF7A0F9002803DB01A80088B3 -:102980000BB0F0BD012002F047F9002A06D0491E25 -:102990008B5C0370521E401C002AF9D17047F0B5C1 -:1029A0008DB0174606780B2E3CD201910293002E73 -:1029B00013D0401C0021182200252B46445DD2B2C2 -:1029C0009440E3186D1C083A042DF7D18A0003AC3B -:1029D000A350491C001DB142EDD102F007FD68462D -:1029E0000760212703AD3846294632462B4603F0BF -:1029F00037FA202238462946029C234603F0DCF9A8 -:102A00000198002805D0129921200123224603F0C5 -:102A1000E3F902F0EBFC03A80021202202F0DDF82C -:102A20000DB0F0BD022002F0F7F80000F0B58DB057 -:102A3000024610780B2843D2012600283DD002968A -:102A40000191521C0024182500273E46D35DEDB2AB -:102A5000AB409E197F1C083D042FF7D1A30003ADA6 -:102A6000EE50641C121D8442EDD10528029E24D133 -:102A70000126F207039B53402C2B03D0542B01D08B -:102A8000312B1AD110490B681C88002C06D0049DEC -:102A90005540A54202D059888D420ED16432059925 -:102AA00091420ADC06990198814206D1074A079BA8 -:102AB00001260021934200D80E4630460DB0F0BDED -:102AC000022002F0A9F8C046201D002050C30000DB -:102AD000F0B58DB002461F4803681C880120002C09 -:102AE00033D01078022801D208462EE001910293DB -:102AF0000B282CD2521C0025182600273B46D15DFE -:102B0000F6B2B140CB187F1C083E042FF7D1A900C4 -:102B100003AE73506D1C121D8542EDD10122D30707 -:102B2000039858402C280299019D04D0542802D0C3 -:102B30003128284609D1049D5D40A542104604D0A5 -:102B40004A88012000219542CED10DB0F0BD02206F -:102B500002F062F8201D0020F0B585B004920C460A -:102B600002780B2A4CD2202121700121002A3DD06D -:102B70000499891E0191461C0023012102920393AE -:102B8000182000221546B35CC0B283405D19521C68 -:102B90000838042AF7D1C9B26018049A511A0122E0 -:102BA000D2072B469343184A7A4402F065FD274624 -:102BB0002046049906F0BCF8C1B2361D019A914234 -:102BC0001BDA002D039B01DB3C4603E027223C4639 -:102BD0006254401CC1B22F226254411CC8B2002270 -:102BE00022545B1CD8B2029A9042C8D3C8B2401E8D -:102BF00000212154C0B205B0F0BD032002F00CF852 -:102C0000022002F009F8C04619620000F0B587B052 -:102C10001C4617460591064602F0E8FB0020069088 -:102C200006AD6846C5600C998160446007600D98E8 -:102C3000002801D00A4900E0084903223046059BDC -:102C400003F0DAF82878C00703D020780121014387 -:102C5000217002F0CBFB07B0F0BDC04601040000BC -:102C6000010600000A020A43FF21090251400180C7 -:102C7000704780B5FF218143000A814201D003F0F3 -:102C800025F880BDF0B5002307241E46155D0F5DB5 -:102C9000F619751905550126FF2D00D81E46671E29 -:102CA000002C3C46F2D101200021FF2D00D808461F -:102CB000F0BDF0B581B0002607240096155D0F5DCC -:102CC000330604D0AF4204D97F1E002303E0009BEB -:102CD00001E0FF373346BFB27E1B06550126AF42E7 -:102CE00000D31E46631E002C1C46E7D1F0B201B093 -:102CF000F0BD000070B582B0044601263002114DCF -:102D0000285C30420DD03F20C0002A580021684680 -:102D10000160416028462830234602F0FDFF300262 -:102D2000285C80070BD53F20C0002A580021684648 -:102D30000160416094352846234602F0EDFF02B061 -:102D400070BDC0467C180020F0B581B07D208600A3 -:102D5000294DA85D002848D03F20C700E8590478D5 -:102D6000FC2C05D801252846FFF7C4FFFF2031E0E1 -:102D7000FE2C19D0FD2C3BD10120FFF7BBFFE859F9 -:102D8000411CE951A95DFF31A955C9B201292CD9CE -:102D900041780091847802252846FFF7ABFF240292 -:102DA00000980443FE2015E00120FFF7A3FFE85937 -:102DB000401CE851A95DFF31A955C9B2032914D9B6 -:102DC00000210A46FFF78EFB044604252846FFF73C -:102DD00091FFFC2008490A46D1594919D151915D0A -:102DE00040189055204601B0F0BD012001F014FFBD -:102DF000022001F011FFC0467C180020F0B5BFB0E2 -:102E00000646E948784402F00BFE857933AC20464B -:102E100005F0D4FEA085ED0801273D4084B2002CCA -:102E200001D000F065FC33A803F0B4F83D90002D0C -:102E3000199700D119951B951DA8C01D189025A89C -:102E4000011D169128301790F1481C961A970746D5 -:102E50006AE2072800D067E23C69002C00D161E2F9 -:102E60007D208500785D002801D100F030FC84428F -:102E700000D30446002CE64F01D100F028FCE0B25C -:102E8000FFF738FF3F20C000395809193950785DE5 -:102E9000001B78553869001B386145E24E7834468E -:102EA000083CE1B2302901D900F01FFCB11C11919E -:102EB000C9B2884201D200F018FCD648784402F02A -:102EC000AFFDD349149D49596A46566025AB059319 -:102ED00013608A1C08302021234602F059FFCC4899 -:102EE00040598019811F08220598FFF7C9FC002866 -:102EF00000D0FAE3C64D149EA8593D21C9006A5C72 -:102F0000002A0DD03A22825C3223C254A859401DB7 -:102F1000A851EA5DF332EA55695C012200293DD1EE -:102F2000811C25AE3046224601F041FE3078322821 -:102F300000D0DAE3B6480546149EAC591698A8515D -:102F40002420FFF7D7FE11996018A851E85D401AB8 -:102F5000E8552F461DA808221799FFF716FD0020F7 -:102F600001460246189E735C7C18257F5219D318BF -:102F700023770122FF2B00D80246491E0C46083455 -:102F8000F1D10125FF2B00D885E0AEE33D20C00044 -:102F90009F49085C0022002800D1A6E31392012675 -:102FA0003046FFF7A7FE9A4D14996858421C6A50A4 -:102FB000E85DFF30E855C0B2232800D895E3F5203E -:102FC0004000285C002826D034022E552420FFF72C -:102FD00091FE00200C942855149C29592431295124 -:102FE000E85DDC30E855C0B2072800D87DE30F204B -:102FF000400128180822039201F0D9FD0398FFF739 -:1030000079FE0C982E54285908302851E85DF83084 -:10301000E855139D3FE0002168460160416017209C -:10302000000128182424234602F076FE2046FFF7EC -:1030300061FE1498295824312950E85DDC30E855A8 -:10304000C0B2072800D850E31DA80822FFF79DFC56 -:10305000002001460246189B5B5C6D4C6418257F7E -:103060005219D3182377FF2B324600D80246491E47 -:103070000C460834EFD1FF2B139D00D935E308200F -:10308000FFF738FE62480146149A88580830885085 -:10309000C85DF830C8553D20C0005D4A105C00286E -:1030A00002D10120010250541C9E159CFFF74CFEDA -:1030B000574F3861022171403D22D200BB5C2B4347 -:1030C0000B430022002B214600D0114600281A9AFB -:1030D00000D104460C4054401B98002802D1002C1B -:1030E00000D102E3022038757D25AC00385D002850 -:1030F00000D1ECE2396901291A9B20D13F20C6009A -:10310000B859007801210022AE2800D11146199A41 -:103110001143012906D101210022AE2800D1114618 -:103120005940F9770120FFF7E5FDB859401CB85127 -:10313000385DFF3038553969491E39611C9E0029B8 -:1031400017D04D1EC0B2854200D30546002D304F2A -:1031500000D1BCE2E8B2FFF7CDFD3F20C0003958F6 -:1031600049193950385D401B38553869401B386162 -:10317000DAE0022E1ED13D21C900795C002915D06C -:10318000F5214900795C002914D0002168460160CE -:1031900041600F2040013A1838462830082302F0D9 -:1031A000BBFDA800385C05E0B86F000001210902F2 -:1031B00003227A54C0B2032800D896E2F5204000DA -:1031C0003D21C900795C00290ED0385C00280BD164 -:1031D0003F20C0003A5800216846016041603846EF -:1031E0002830042302F098FD0420FFF783FD3F20E0 -:1031F000C0003958091D3950385DFC303855012060 -:103200003875B868401EB860F868401CF8608BE0FC -:103210007C180020006F0000F5204200B95C3D25BD -:10322000E800385C00284FD000294DD120266846A0 -:10323000466025A909910160172000013C180B94F4 -:10324000012104910023089320460F92099F3A46DA -:103250000E9502F061FD204602F07EFD6846076093 -:1032600046602046049D29463A46334602F054FD06 -:10327000684646601DAF0760ED4C2834204629465D -:103280003A46089B02F048FD204602F065FD68467C -:1032900007604660204629463A46334602F03CFD28 -:1032A0000B980999324601F082FC19200001E0498F -:1032B00008183946DE4F32461C9E01F078FC0F9804 -:1032C000395C0E98C000385C002822D0002920D03C -:1032D000D848385C00280BD1002168460160416065 -:1032E0001B2000013A1838462830202302F014FD34 -:1032F0000A20387518E0052816D17D208400385D35 -:10330000002800D1E3E13D69002D00D01BE7042037 -:1033100076E709213975002806D03846283002F0B2 -:103320001BFD01E008203875397D00E03975C8B211 -:10333000042807DC02286EDD03282AD00428F3D1F4 -:10334000B86836E0062800DDBBE1D4D17D208400DA -:10335000385D002800D1BAE1032800D8C5E1042077 -:10336000FFF7C8FC3F20C000E74F3958091D39500E -:10337000385DFC3038550821FF221042D6D0012498 -:10338000250200207855FFF7DFFC7C5538610721C6 -:10339000CCE7022E00D13FE77D208000385C00287A -:1033A00000D194E1FFF7D0FC0021B860F96004215E -:1033B000397506210028B9D07D208400385D0028A9 -:1033C00000D184E1072800D88FE1012ECE4F11D122 -:1033D000012040023858F96881420BD13F20C000DB -:1033E000395838461530082201F0E1FB7F20800073 -:1033F000012139540820FFF77DFC3F20C0003958D7 -:1034000008313950385DF8303855FFF79DFC386188 -:103410000520387571E7002806D0012802D002285F -:1034200082D161E6B868E0E00026BE60FE603E61E1 -:10343000384615300822314601F0CFFB3D4628358D -:10344000284602F089FC3C469434204602F084FC75 -:103450003D20C000385C00283AD0012000023E54D4 -:10346000F5204000385C00282DD068460660466094 -:10347000772080003A1804232846314602F04CFC9D -:10348000684606604660172000013A18079220201F -:10349000069028463146069B02F03EFC68460660D0 -:1034A0004660192000013A1828463146069B02F072 -:1034B00033FC684606604660602320463146079A22 -:1034C00002F02AFC04E017200001381802F044FC46 -:1034D0007D2010908600B85D032800D805E13F20CC -:1034E000C5007959772080001290381804240A907A -:1034F000224601F05CFB2046FFF7FCFB7859001DDB -:103500000D957851B85DFC30B8558049795C00293B -:1035100017D0C0B2032800D8E7E07B4F0D9D795942 -:103520004920000138180424224601F040FB2046BF -:10353000FFF7E0FB7859001D7851B85DFC30B855B5 -:103540001FE0734800684021405C16280A9C18D888 -:10355000012181406F48014213D0002120460A46D4 -:10356000FEF7C0FF00280CDA002120460A46FEF7CD -:10357000B9FF6949884204DB109880006249085C01 -:10358000C7E7634800684421415C890718D5007A81 -:10359000022806D0042813D15B481299405C012808 -:1035A0000ED8594CA05D032800D89EE00420FFF7F8 -:1035B000A1FB0D996058001D6050A05DFC30A05526 -:1035C000FFF7C2FB504FB860252149011C9E022E17 -:1035D000524A08D1795C002905D05168002900D1F0 -:1035E0005060002111600121397500281DD07D2017 -:1035F00039468700C85D002869D00124022E1BD0FF -:10360000012E254600D051E523286ED92420FFF74E -:1036100071FB3F20C0003C490A461158243111502B -:10362000D05DDC30D055012540E5032038757BE6C0 -:103630007C1800208E040000012856D93F21CA00C2 -:103640001492314989580A78022A159400D19DE4D0 -:10365000012A00D122E4002A47D13D20C0002A4996 -:10366000085C002841D12E4C7C44204602F0D8F959 -:103670008088FFF7FEFA204602F0D2F98088C0B2B7 -:10368000042806D0022804D001282ED11B98002837 -:103690002BD01D4C149D6059401C6051E05D401EB4 -:1036A000E055C0B2232820D92420FFF723FB60591E -:1036B00024306051E05DDC30E0550120A07700252A -:1036C000E9E401460839032901D3FFF7C2FB02F000 -:1036D00055FC33A9884202D13D9802F05BFC33A827 -:1036E000808D00280DD13FB0F0BD012001F094FA8B -:1036F00033A8002585853D9802F04CFC02480575ED -:10370000204601F089FAC0467C1800208E04000093 -:10371000201D0020800140000300008000180020D0 -:1037200054670000F0B581B000900B0901221340EE -:103730005B42194C1C40CD0815406D42174E2E407F -:103740004701774067404C091440644214482040C8 -:1037500078408E0916407642124F37404740C809DC -:1037600010404042104A02407A4098272F40009D66 -:10377000ED0E49012943C9B2794079251D404D40DC -:10378000F32121406940AE2333404B401E210140CC -:103790005940104601B0F0BDE2996DB7618EBCF2A0 -:1037A000C4B35F3EA8E2AB2E70E4434FF0B581B0E6 -:1037B00015460E4607463C78012000210090FFF791 -:1037C000B1FF002C12D07F1C1F22224042403C78C7 -:1037D0001046FFF7A7FF7F1C002CF5D106E0FFF78E -:1037E000A1FF0246307850406D1E761C002DF6D1A8 -:1037F0000824FFF797FF641EFBD1009A504001B0E8 -:10380000F0BD000070B514460A4601460D487844E4 -:10381000FFF7CCFF23220546D54020239E1A0B46F6 -:10382000B3402B431646203E0D46F540002E00DAED -:103830001D461F232B402370531F641C002A1A4669 -:10384000E9D170BD4E560000F0B599B01D46034653 -:10385000002017901690107014296FD11E99002027 -:10386000002904D0012969D10192082000E00192C9 -:103870000CAF3870781C1422194601F098F9152104 -:103880000026324630463B78000218431346083380 -:103890007F1C491E0224E443A2420EDB0D32134674 -:1038A0000A3B0446DC401F23234002ACA355521FB1 -:1038B000761C092AF3DC521F00E01A460029E2D1E7 -:1038C000002A019F07D00521891A88401F21014045 -:1038D00002A88155761C02A816AA3146FFF792FF6E -:1038E0000020002E394611D002A801780023144A86 -:1038F0007A44202920D2581CAB421DD202ACE45C91 -:10390000145DFC54B0420346F3D3391800220D4B2A -:103910007B4416AC2478202C0ED28418641CAC4254 -:103920000AD816ACA45C1C5D8C54521C082AF0D337 -:1039300000238B54801801E00020387019B0F0BDCE -:10394000785500005855000070B594B014460A46EA -:10395000014601A8FCF771FB01460020002912D0A6 -:1039600001A8027800216B461960011D21250CAECB -:103970002846334602F074FA202228463146234670 -:1039800002F01AFA012014B070BDF0B59DB01446D3 -:1039900013AAFFF7D9FF0025002811D021266F4672 -:1039A00013AA0125304639462B4602F015FA08378E -:1039B0003846FEF757FB20463946324601F0F7F805 -:1039C00028461DB0F0BD0000F0B58BB00746119C35 -:1039D000012F17D0129E032F12D1212205AF0846C6 -:1039E00011463A46FEF763FF00256846056014213C -:1039F000384622463346FFF727FF002836D136E007 -:103A0000022F25D10393049405A8142545700024A2 -:103A10000470861C2122084611463246FEF747FFF5 -:103A2000022F0DD11099002908D0684605600022A8 -:103A30000498334602F0BCF8002817D1002516E0A0 -:103A40006846039912C005A816219623049D09E033 -:103A500025460024684614C00648301883B2212247 -:103A6000084611462A46FEF751FF2C5401252846E8 -:103A70000BB0F0BDFFFF000070B59AB00E460446D3 -:103A80002069002500282AD0217BA068401CFF3136 -:103A9000C9B211AA00252B46FFF777FF00281ED0D8 -:103AA000F388B288A0680078716B33256E46B560E4 -:103AB00004AD22C611A9FFF787FF002500280ED00C -:103AC000246904AD284605F09BF8421C284621468F -:103AD00004F04EFF01250021002800D00D462846A5 -:103AE0001AB070BDF0B585B00A4606460020B07326 -:103AF00034460E34317B082927D803AF00210191C9 -:103B00000825384602922A4601F067F8327BA81A47 -:103B10003818B16801F04BF8029D2735284605F0AA -:103B20006FF8C6B220462946324601F040F8202000 -:103B3000A055A019421C0298416C3846FEF758F96E -:103B40003018201801994170012005B0F0BD000027 -:103B500070B598B004466D466021284604F0F2FE28 -:103B6000A16928461C30402205F0ACF85C20295C95 -:103B70000020002917D1227B082A14D8267D082E80 -:103B800011D86D46A81A1430A16804F0E1FEA81BF4 -:103B90001C302169324604F0DBFE044860222946CD -:103BA00004F0D6FE012018B070BDC04600180020F9 -:103BB00010B50C490860FEF7E5F9252040010A49D7 -:103BC00001240C5401F062F92102084804F0BAFE05 -:103BD000002003F03FFE204603F03CFEFCF7FEFA17 -:103BE00010BDC046201D00207C180020241D002090 -:103BF00080B506480078002801D104F089FC04490A -:103C000079440020024604F031F880BD241D0020D4 -:103C1000A457000080B582B001900648784401F0B6 -:103C2000FFFE293001A9012202F05AF8FFF7E0FF58 -:103C300002B080BDA061000001460020022903D827 -:103C400088000249794408587047C046BC560000B5 -:103C500080B5012805D0002807D10020FFF7DAFF42 -:103C600080BD0120FFF7D6FF80BD002003497944C5 -:103C7000034A7A4404F046FC80BDC04613000000AD -:103C80002700000001460020012903D888000249CE -:103C9000794408587047C0467C56000080B500281B -:103CA00002D0FFF7A5FF80BD0648784401F0B8FEBA -:103CB0002921435C002004497944044A7A4404F0F1 -:103CC00003FC80BD126100007DFFFFFF91FFFFFF3D -:103CD00080B5002003497944034A7A4404F012FC79 -:103CE00080BDC046ABFFFFFFBFFFFFFF80B5FF20D9 -:103CF00002F010F980BD80B50120FCF7FBFDFFF755 -:103D000077FF80BD80B50020FCF7F4FDFFF770FF62 -:103D100080BD80B50120FCF7EDFDFFF769FF80BD98 -:103D200080B50020FCF7E6FDFFF762FF80BD80B59F -:103D30000020FCF7DFFDFFF75BFF80BD80B50120B1 -:103D4000FCF7D8FDFFF754FF80BD80B50020014689 -:103D5000FDF746FCFFF74CFF80BD80B50120002138 -:103D6000FDF73EFCFFF744FF80BD80B50020FCF767 -:103D7000C1FDFFF73DFF80BD80B50120FCF7BAFD16 -:103D8000FFF736FF80BD80B50178490601D001F00C -:103D9000F3F880BDB0B5054607202840002401286F -:103DA00014D0022814D1002909D00B4802F0BEF823 -:103DB00068B200280ADA01F089FF002406E0FF213A -:103DC00052310548002202F0C9F804462046B0BD31 -:103DD000022000F021FFC046E81F0020F0B581B0AE -:103DE000E04D28780C2810DD0D286CD00E2800D16D -:103DF000C7E015280FD1DC48807901280BD1A879BC -:103E0000000708D4102000F007FF052800D111E1B9 -:103E10000C2800D181E2D54C00276760012020707A -:103E2000204602F047F8042002F0C0F860606928DC -:103E300000D05DE101F044F801F044F8BE25F84EF1 -:103E40007753042002F0B2F86060002800D164E2E9 -:103E5000972800D161E2C0243059002800D15CE2EB -:103E6000705BAA27C421715C80B2884200D354E2FF -:103E700002F068F8002800D04FE201F0E5FFB842F8 -:103E800004D102F00BF8B84200D046E23059715B21 -:103E900049014018CC217158002902D088470028D8 -:103EA0000AD0012803D13059715B490140180178CB -:103EB000490601D001F060F8705B401C7053315925 -:103EC0000029CFD129E2D54C00276760012020705E -:103ED000204601F0EFFF042002F068F8606000283F -:103EE00000D11AE2972800D117E2692800D099E1A1 -:103EF00000F0E6FF00F0E6FFBE25C94E7753042030 -:103F000002F054F86060002800D106E2972800D142 -:103F100003E2C0243059002800D1FEE1705BAA27DB -:103F2000C421715C80B2884200D3F6E102F00AF845 -:103F3000002800D0F1E101F087FFB84204D101F080 -:103F4000ADFFB84200D0E8E13059715B490140183B -:103F5000CC217158002902D0884700280AD00128B6 -:103F600003D13059715B490140180178490601D0ED -:103F700001F002F8705B401C705331590029CFD119 -:103F8000CBE1EA4D00276F6001202870284601F040 -:103F900091FF042002F00AF804466C60692C00D0FE -:103FA000E6E000F08DFF00F08DFFBE24E04E3753B9 -:103FB000042001F0FBFF6860002800D1ADE19728E4 -:103FC00000D1AAE1C0257059002800D1A5E1305BDD -:103FD000AA27C421715C80B2884200D39DE101F020 -:103FE000B1FF002800D098E101F02EFFB84204D1C3 -:103FF00001F054FFB84200D08FE17059315B4901A4 -:104000004018CC217158002902D0884700280AD0D6 -:10401000012803D17059315B4901401801784906E4 -:1040200001D000F0A9FF305B401C305371590029CA -:10403000CFD172E1BD4C002767600120207020467F -:1040400001F038FF042001F0B1FF6060002800D1CA -:1040500063E1972800D160E1692800D018E100F001 -:104060002FFF00F02FFFBE25B14E7753042001F043 -:104070009DFF6060002800D14FE1972800D14CE1FE -:10408000C0243059002800D147E1705BAA27C42121 -:10409000715C80B2884200D33FE101F053FF0028F9 -:1040A00000D03AE101F0D0FEB84204D101F0F6FEB2 -:1040B000B84200D031E13059715B49014018CC2140 -:1040C0007158002902D0884700280AD0012803D15E -:1040D0003059715B490140180178490601D000F060 -:1040E0004BFF705B401C705331590029CFD114E154 -:1040F000C0258F4C6059002800D106E1BE26A05B88 -:10410000AA27C421615C80B2884200D3FDE001F09F -:1041100019FF002800D0F8E001F096FEB84204D163 -:1041200001F0BCFEB84200D0EFE06059A15B49014C -:104130004018CC216158002902D0884700280AD0B5 -:10414000012803D16059A15B490140180178490653 -:1041500001D000F011FFA05B401CA0536159002961 -:10416000CFD1D2E0241E00203C210020501F00208F -:10417000D8206F4D2958002911D0642264290B469C -:1041800000D31346CA1A2A50D421002A07D16958ED -:10419000002904D0DC22AA582A5000208847002C8D -:1041A00000D1BAE0972C00D1B7E0C02428590028EC -:1041B0002FD0BE26A85BAA27C421695C80B28842A2 -:1041C00027D201F0BFFE002823D101F03DFEB84206 -:1041D00003D101F063FEB8421BD12859A95B490104 -:1041E0004018CC216958002902D0884700280AD0FD -:1041F000012803D12859A95B4901401801784906D3 -:1042000001D000F0B9FEA85B401CA8532959002931 -:10421000D2D1C420285CBE21695A7AE0501F002008 -:10422000241D0020C025424C605900286DD0BE26B8 -:10423000A05BAA27C421615C80B2884265D201F0EC -:1042400081FE002861D101F0FFFDB84203D101F0E9 -:1042500025FEB84259D16059A15B49014018CC21D3 -:104260006158002902D0884700280AD0012803D1CC -:104270006059A15B490140180178490601D000F05E -:104280007BFEA05B401CA05361590029D2D13CE0C9 -:10429000D020274C2058002803D0E978490800F0A6 -:1042A000AFFEC025605900282FD0BE26A05BAA27EC -:1042B000C421615C80B2884227D201F043FE00280D -:1042C00023D101F0C1FDB84203D101F0E7FDB842AE -:1042D0001BD16059A15B49014018CC2161580029CC -:1042E00002D0884700280AD0012803D16059A15B79 -:1042F000490140180178490601D000F03DFEA05B5D -:10430000401CA05361590029D2D1C420205CBE2199 -:10431000615A814201D301F015FE01F013FE00281D -:1043200001D100F081FC012001B0F0BD501F002040 -:10433000241D0020F0B5A5B01E4614460F460546C4 -:10434000FEF7BAF9002807D0A74979440A22204687 -:1043500004F0FEFA25B0F0BD0494A14800684024A2 -:10436000005D112844D128463946FEF704FA03902F -:104370009B480068005D11283AD128463946FEF76F -:10438000BDF9002812D07B208000039C002C07D0B0 -:104390009449085C002803D0083D2846FDF77EFEBE -:1043A000002C04987ED0924979447DE08C480068C6 -:1043B000005D11281CD128463946FEF7D7F90028A0 -:1043C00016D07B2080000399002907D08549085C1E -:1043D000002803D028460838FDF760FE2C78FD2C15 -:1043E0007F4F64D16878A97809020143C81C5FE057 -:1043F0002846FDF767FF002810D079480068406B19 -:104400000028A7D001F00CFB0146A8786A4610608E -:10441000EB1C0022049801F0CBFB9BE7704F38683F -:10442000C4882846FDF7C8FE0321002802D038685A -:1044300084880421200A04D005AA54701070022731 -:1044400002E005A80470012705A8C0196918142501 -:1044500003902A4600F0ABFBFF20EA306149085C7C -:10446000002810D05E480068C288012000219442D4 -:1044700000D008466946086014210398049A334620 -:10448000FFF7E2F966E7012069460C6048602F43B8 -:10449000B9B2B3B205A8049C2246FEF737FA002150 -:1044A000215457E75149794404F0A2FB52E7601CBC -:1044B0002918153920AE1422304604F049FA307814 -:1044C00000281CD0002020A94E4A7A440B781C09F1 -:1044D000145D05AD2C542C180F251D40535D6370E1 -:1044E000491C801C2928F1D3282005AB0021195430 -:1044F0004121454A7A44049801F0BEF82AE7032096 -:104500000121FD2C00D00846295C4018295C411887 -:10451000039800280CD0685C0818401C295C00290E -:104520000AD04C2909D1291849784018801C04E088 -:1045300068184078891C09E0401C291849784018FF -:10454000801C295C0818401C295C491C08182A5C3E -:10455000411C4C2A00D001466C186078A1780902F1 -:104560000143E078227912020243100408431F90AD -:104570001FA820497944042204F070FB00280DD0C4 -:104580001FA81E497944042204F068FB002800D0CB -:10459000E0E61B4979440B220498D9E63D68287966 -:1045A00019AE307021461131701C15273A4604F0BF -:1045B000CFF9A88801216A4603C205AD50233046D1 -:1045C00039462A46FEF7A2F9002129544420205CEE -:1045D000694608604121084A7A4404982B468BE7D3 -:1045E000201D00207C1800206A530000BC4D0000F4 -:1045F000A94E0000F84C0000994C0000084D000046 -:104600002C510000C74D0000AE4D0000F0B597B032 -:1046100001AD50242846214604F094F94548464F00 -:10462000391815A80822FEF7B0F9444838187B213C -:1046300089002A462346FFF77DFE414E4022304640 -:10464000294604F03FFBA3208000385C142811D1D8 -:104650003C48381840497944042200F0C7FA002841 -:1046600008D1394838183D497944042200F0BEFA8F -:1046700000282FD0354C374626682736304604F0C0 -:10468000BFFA02463D4641352846314600F08FFAD2 -:1046900026682736304604F0B3FA202129543046E4 -:1046A0003E4604F0ADFA2818401C83218900224AB6 -:1046B000505015A8FDF756FC05462068273004F039 -:1046C0009FFA2818401C3018412100224254012032 -:1046D00017B0F0BD1E48381801210022FDF702FF77 -:1046E0000346304641301F2B06D0032B07D0012B49 -:1046F0000BD11B49794404E01A49794401E01A4975 -:104700007944062204F024F904E01421174A7A447B -:1047100000F0B2FF35464135284604F071FAC4B2C4 -:1047200028198321890078500A483818FDF71AFCA7 -:104730002018C8E7820200007C1800208A020000CE -:10474000001800208D02000091020000201D0020B2 -:1047500095020000990200005D4C000063500000CB -:10476000C44B0000C44B0000C44B0000BC4B000015 -:1047700070B58CB020206946486004AE0E600C48CD -:1047800094300C4D2A46413201240023214601F089 -:10479000C3FA6846082306601836436086604121E4 -:1047A000054A7A44284600F067FF20460CB070BDE9 -:1047B0007C18002000180020374B000010B5252081 -:1047C00040010D4C215C0020002900D010BDFFF7F6 -:1047D0001DFF8F20C000205808496158491C0B1A42 -:1047E000074855301421074A7A4400F045FFFCF78A -:1047F0007BFC012010BDC0467C1800207C0400001A -:1048000000180020FD4A0000B0B582B0252040010C -:10481000164D285CA97F01430024002902D02046C0 -:1048200002B0B0BD12482A18294615316846FEF775 -:1048300040FA0028F3D00F48285C01240328EED169 -:1048400000206877F52040003D21C900695C0029FF -:1048500007D0295C002904D101242C54002028759C -:10486000DDE70A2028750124D9E7C0467C1800201E -:10487000850400008404000080B5FFF779FF012063 -:10488000FDF7F8F980BD000010B5044604497A220E -:10489000FEF762F900212046FEF7C8F810BDC046B9 -:1048A0000018002010B5074CC834204604F0A8F9C1 -:1048B000202121542018002141700120FCF71AF812 -:1048C00010BDC046E81F002080B503497944002090 -:1048D000024603F0CBF980BD544B000080B503497C -:1048E00079440020024603F0C1F980BDB04B0000BE -:1048F00080B505497A22FEF72FF904497944002052 -:10490000024603F0B3F980BD00180020384C0000C7 -:1049100080B505497A22FEF71FF904497944002041 -:10492000024603F0A3F980BD00180020C44C00002B -:1049300080B5034979440020024603F097F980BD11 -:10494000684D000010B58CB06C46204604F036F976 -:10495000A0850D49084206D1684601F01BFB0A906C -:10496000FF2001F0D7FA01F009FB6946884202D125 -:104970000A9801F00FFB6846808D002801D10CB029 -:1049800010BD00F049F9C046FFFF0000F0B59FB030 -:104990000446002C2FD10DAC00264822204631467B -:1049A00000F01BF9032525720D9633480E90204622 -:1049B0000930344979440526324603F0C9FF2046C0 -:1049C0001730314F7F443946324603F0C1FF20464D -:1049D00027303946324603F0BBFF26462D362B4999 -:1049E000794430462A4603F0B3FF40201121215478 -:1049F0001A9604201E9021480460214C01200102D7 -:104A0000204603F09FFF01AD284604F0D7F8A885A3 -:104A100085B2002D0BD001A8002181850B9801F0F3 -:104A2000B9FA0B9801F0B6FA102DE7D01FE001ADEE -:104A3000284601F0AFFA0B9000F028FAFDF7A2FA31 -:104A4000002002F007FF012002F004FFFFF7D0F87A -:104A5000FBF7C4FB01F092FAA84202D10B9801F0D7 -:104A600099FA01A8808D0028C8D000F0D5F8FFF78A -:104A700069FF1FB0F0BDC0463A003200201D002083 -:104A8000241D00203C490000314900001A49000063 -:104A9000F0B59FB00446A068002831D10DAD0027C5 -:104AA00048222846394600F098F8032000902872E2 -:104AB0000D9737480E902846093037497944052725 -:104AC0003A4603F045FF28461730344E7E443146BF -:104AD0003A4603F03DFF2846273031463A4603F078 -:104AE00037FF2E462D362E4979443046009A03F082 -:104AF0002FFF4020112129541A9604201E90A560F2 -:104B00000027244E01AD284604F058F8A88530420D -:104B100007D101A801F03EFA0B90F8070FD001F081 -:104B2000D5F901F02BFA01A9884202D10B9801F0C6 -:104B300031FA01A8808D002828D10127E2E70A2058 -:104B400001F0B8F86068022817D004280BD00328B9 -:104B5000E5D1E06800218161A168E068FEF78CFF83 -:104B6000E1688861DBE7E0680021C162A168E06874 -:104B7000FEF7B8FFE168C862D1E7E068FEF7E8FF3A -:104B80000028CCD0A068FFF713F8C8E700F044F87D -:104B90003A003200FFFF00003448000029480000BE -:104BA0001248000080B5002001F0F4F980BDB0B5D6 -:104BB000884208D9002A0FD0491E401E8B5C8354BE -:104BC000521EFBD108E0002A06D000239CB20D5DE6 -:104BD00005555B1C521EF9D1B0BD80B50B46002AAD -:104BE00003D011461A4603F0BBFE80BDB0B50023CA -:104BF000002A0FD0401E491E8C5C855C521EA542C7 -:104C000002D1002AF8D105E00020C0430123A542CB -:104C100000D80346D8B2B0BD10B5044601F0AEF9D5 -:104C2000214603F0D7FF000080B501F08BF9002882 -:104C300000D080BD0648002141706022027002222F -:104C40008270C1700171052101F070F980BDC0460C -:104C5000241E0020B0B51A48C078032807DC0128BC -:104C60000DD0022828D1174802F073F9B0BD0428EE -:104C70001FD0082820D1134802F069F9B0BD114CAB -:104C80000121204602F05EF9204602F03DF90E4C6B -:104C9000A079002811D120460C3000250422294695 -:104CA000FFF79BFF1034082220462946FFF795FFA7 -:104CB000B0BD044802F049F9B0BD1020FFF7ACFFC9 -:104CC000241E0020FC2100203C2100207F210140E7 -:104CD0000020032903D8C8B201490818007B704797 -:104CE0003C21002080B516480179042918D00229FA -:104CF00006D0012922D1811D134802F00DF880BD94 -:104D0000C2787F211140032918D8C9B24A000D4B3F -:104D10009A1800231382821D0B4802F082F880BD8E -:104D2000C2787F211140032908D8C9B2054A521818 -:104D300043791373821D044802F01CF880BDC046FD -:104D4000241E00203C210020FC21002070B51546C7 -:104D50000E460446FF2D1BD80E485021017020211D -:104D600001714571E91C817080222243C270090AD9 -:104D70004170062101F0DAF83046294601F0D6F8F4 -:104D80007F2020404000044908187D21090101824C -:104D900070BDC046241E00203C21002080B50A467C -:104DA000014682201423FFF7D1FF80BD80B50A465B -:104DB000014683201423FFF7C9FF80BD80B50C484E -:104DC0000178002900D080BD062181710A2101707F -:104DD00008498B784A7812021A43FF232A339A42F1 -:104DE00000D31A464280C91C0348FFF7E0FE80BD8D -:104DF0003C210020241E0020E81F0020B0B52048E0 -:104E0000827841780902114300780F280ADC0E28C5 -:104E100010D00F2823D10020012927D1FFF71AFF36 -:104E20000120B0BD10281ED0162818D1FFF7C6FFEC -:104E30000120B0BD13488168643181601621124A97 -:104E4000435A002B08D06424642B1D4600D325460A -:104E50005B1B435213420ED0891E0E29F0D1022053 -:104E6000FEF7BCFFB0BD0020032900D2B0BDFFF7A4 -:104E700039FF0120B0BD002101701020FFF7CCFEEA -:104E8000241E00203C210020FFFF0000B0B50A20B6 -:104E900000F010FF084C0025182220462946FFF795 -:104EA0009CFE65802570A571A56000F061FB03483C -:104EB00005604560B0BDC0463C2100205421002063 -:104EC0007047000002480021016041607047C04601 -:104ED00054210020F0B589B00546084600F0A0FD39 -:104EE0000446002C43D02069002840D0284600F01A -:104EF00097FD014602AD1C2228460192FFF757FE9E -:104F00002168E98062682A81A0681A4F65233B7096 -:104F100089B292B24A434243D1084E1C07231A4237 -:104F200000D10E46314600910426864070181D308F -:104F3000B870000A78700321384600F0F7FF284661 -:104F4000019900F0F3FFA06838700121384600F0A5 -:104F5000EDFFE06800F064FDB1B200F0E7FF0098FB -:104F600085B2206900F05CFD294600F0DFFF09B042 -:104F7000F0BDC046241E002070B500F051FD04466F -:104F800020787F26064000F0DDFF002830D1002E7B -:104F90002ED0E06900281DD000F042FD0546052E08 -:104FA00002D1A07E002824D0284603F029FE064620 -:104FB00012486521017031461C318170090A417027 -:104FC000032100F0B3FF1C21204600F0AFFFB1B277 -:104FD00028460BE0094800214170652101701C251D -:104FE0008570032100F0A2FF2046294600F09EFFB5 -:104FF00070BD20462946FFF76DFF70BD241E0020BE -:1050000070B50446002C28D01448066845688E42C6 -:1050100001D16D1C45600E43002902D00660324666 -:1050200005E00022026042600D4B5B1C1E438A4279 -:1050300001D000214160082D0CD30321284603F044 -:1050400091FB012290073043002900D03046D10760 -:10505000884300E030462946A04770BD5421002017 -:10506000FFFFFF7FF0B581B00F4E01243470B11CFB -:10507000FF2750377A1C204600F03EFF054675702A -:105080007A1B7719F91C022000F036FFB8702D1832 -:105090007619F47000F024FF3071902070710020B8 -:1050A000B071E81D01B0F0BDE81F0020F0B58BB075 -:1050B0000A46064607210E4207D03346D8B291B2BF -:1050C000FEF768FE80B20BB0F0BD4B208400832059 -:1050D0000390AA4DA84F3346019109E06920A949E0 -:1050E00008700398801C487002220199079B2DE1EB -:1050F000102130460840049292B20592002A06968A -:1051000000D1B5E0002800D0B2E0079300910290F2 -:1051100007E0A1B20022384600F020FF012000F095 -:105120003FF900F00FFF0028F3D17D200001A968AE -:105130000E1828780928079A42DC072848D0092841 -:1051400063D100218E48079101F0F8FB10E0FFF7D2 -:105150006BFDA1B20022384600F000FFA868B04203 -:1051600000D3FEE0FFF74AFE00F0ECFE0028F0D18D -:10517000834801F039F90028E9D0059AD01D40088C -:10518000A92800D3F3E003980D307E4B985498186B -:1051900007994170581D0499891C8AB205921946D5 -:1051A000FFF705FD052277480799FFF716FD0598DB -:1051B000401D83B272480399724A01F0D3FB3FE06D -:1051C0000A2804990AD00B2822D17148784401E0BA -:1051D0006E487844059900F035FA31E020462530D4 -:1051E00080B2059E864200D9C1E053203870B97064 -:1051F000080A78700321384600F098FE614831466D -:1052000000F094FE002028701DE0002800D1ABE0E3 -:10521000D0B20599FEF7BEFD002811D0A4E0FFF73B -:1052200003FDA1B20022384600F098FEA868B04203 -:1052300000D396E0FFF7E2FD00F084FE0028F0D1F5 -:1052400028780028EBD10020A87128706880069E7D -:10525000B10600D536E7FFF7E7FC30060298009963 -:1052600006D5089108AA484B1846114601DF029856 -:10527000002804D170066ED40020A8712870002088 -:10528000688000F05FFE002801D1FFF7CDFCA1B2DD -:1052900000223846079200F061FE022806D8B9784D -:1052A0007A7812020A43D11C81423DD1FFF7A6FD54 -:1052B000688829780029E4D00028E2D0354979446B -:1052C0000422304E3046FFF791FC00282ED03249A0 -:1052D000794404223046FFF789FC00282BD02F495F -:1052E000794404223046FFF781FC002837D1039827 -:1052F0002730C6B200F0D2FDB04200D0EEE6012069 -:10530000204E3070B01C402100F0BAFD7070811C3E -:10531000184A121D1140039B0D337354C11C1140D8 -:1053200000237354021D10E00020A7E7FFF79AFE48 -:105330000246002309E00020707003980D303070A1 -:1053400080200699014302220B460199DEB20B42EE -:1053500000D1CDE6B2E6688806494018B2E6688812 -:10536000B0E61020FFF758FC0920FFF755FC02209B -:10537000FFF752FCFBFF0000241E00203C21002010 -:105380005C210020E81F0020BE9A0060C7FBFFFFE1 -:10539000DDFBFFFF1244000005440000FA4300005B -:1053A00070B5044600F0CEFD002801D1FFF73CFCAB -:1053B0004B2081000B4E002530462A4600F0CEFDE2 -:1053C0003078152806D8012181400748014201D0D4 -:1053D000002C05D1FFF712FD0125002800D105465C -:1053E000284670BD241E00202070200010B5FFF755 -:1053F0001BFC084C4B2081000022204600F0AEFD33 -:1054000020780E2801D0FFF7F9FC00F09BFD002862 -:10541000F0D110BD241E0020F0B581B000920F46DF -:1054200004464B4EB74210D0494D00214026284635 -:105430003246FFF7D2FB00984028024600D332469E -:1054400028463946FFF7B3FB414EB07801280ADC05 -:10545000002828D0012869D1F01C042100F04EFC5E -:10546000402130462BE0022827D005285ED1307934 -:10547000F17809020143374C2068002781425BD153 -:10548000206800281ED03448009D2918334A13682C -:105490006D1FADB2AB4200D21168051D0D40304802 -:1054A0000068711D34E0F01C002704223946FFF724 -:1054B00094FB40213046A0473EE025484021A047CC -:1054C000002739E0B079717909020143254801606C -:1054D00001684908A8292FD801682048016071781F -:1054E000327812020A4320490A601D491F4A0A60A5 -:1054F000009D691F8AB218495218D21C0368ED1F1B -:10550000ADB2AB4200D202680D1D1540F11D174827 -:105510002A46FFF74CFB11480168491B01601048FF -:105520000168491901602068401C20600B4801682F -:1055300001200227002907D1064800210160084800 -:105540000160064801603846C0B201B0F0BDC046F7 -:10555000A0210020E0210020FBFF0000E821002026 -:10556000EC210020E4210020F0210020E81F002091 -:10557000034800210160034801600348016070474F -:10558000E0210020EC210020E8210020F0B581B0CE -:10559000264F3A68264C2168002921D0002A1FD0C6 -:1055A0000090264D002140222846FFF716FB0520DB -:1055B000A87023480168090A2970006868701D49AD -:1055C0000868000AE87008682871096820680029DE -:1055D0000ED03B263B2800D826683968681D12E0AB -:1055E00014480021016039601348017021601BE0FC -:1055F0003926392800D826682068000A6871206892 -:10560000A8713968E81D3246FFF7D1FA009A0949B6 -:105610002068801B20603868801938600868401C4A -:10562000086006484021904701B0F0BDEC21002001 -:10563000E8210020E02100203C210020A0210020C2 -:10564000F021002080B500290BD0064A002313600A -:10565000054A1160054A064B1360064A1160FFF7C0 -:1056600095FF80BDE0210020E8210020EC210020F2 -:10567000E81F0020E421002081B0F0B58EB015466F -:105680000C4606901393022C00D2BAE1069800282B -:1056900000D1B6E1002D00D1B3E10698214603F018 -:1056A00051F913A809902978002900D1A9E1671EB2 -:1056B000002602E0A8194178761CC8B2002801D063 -:1056C0002528F7D1BE4200D33E46069C20462946F7 -:1056D000324603F041F9BF1BA4190694002F00D1F4 -:1056E0008FE1A95DAD19252900D087E16B1C002051 -:1056F00020210A220892049005900790044608464B -:1057000004E009990A1D0992096804911D46224680 -:1057100029786D1C00242D29F9D0472918DC2F2960 -:1057200026DD0B46303B0A2B00D366E130290446C8 -:1057300000D10C46079B002B00D004460A23079893 -:1057400043435818303807902B4620461446DDE76F -:10575000672904DD722921DD73293AD122E062290B -:105760003CDC48294BD1014601200590084617E052 -:10577000252958D02A2926D02E2900D03DE1297884 -:105780002A2900D03AE16A786B1C01242A21482A90 -:10579000B7D0682AB5D0732AB3D02FE1682936D1A3 -:1057A0001021089109990B1D0993032313400968DF -:1057B000012B00D1BBE0022B00D1BAE0032B2B461A -:1057C0001446A3D0C6E02978022473292B4698D02A -:1057D00014E1752929D078291CD00EE1632900D164 -:1057E0009BE0642900D008E1029003970998011D0D -:1057F00009910068C11742184A40C00F1CE058299F -:1058000000D0FAE0014601200590084602E0702928 -:1058100000D0F2E0029003970998011D09910268F7 -:105820000020102709E025207BE0029003970998CB -:10583000011D0991026800200A270124974208925D -:10584000049012D8012638460446394602F004FF77 -:10585000B04209D1384660430799491E079108991B -:1058600088422646F0D900E034460798411E049B42 -:10587000002B00D107990026F243002B029800D19B -:105880001A460192C2B2302A06D1002B04D00AA8CF -:105890002D23037000230126881E0D280BD80AA88B -:1058A0003043491E049303F05BF8049B079880196A -:1058B00001994018461E002B03D00AA82D218155BE -:1058C000761C0598002C1AD0002802D05348784442 -:1058D00001E05148784407900898214602F0BCFE48 -:1058E000394602F03FFF0798405C0AA988552046D8 -:1058F000394602F0B1FE761CA7420446ECD9039F5C -:10590000BE4200D33E460AA9069C2046324603F01A -:1059100023F8BF1BA41906946DE00998011D099195 -:105920000068069908707F1E491C069163E0049E7A -:1059300016E00878002860D10499B94200D33946AE -:105940002022069C2046049103F00AF804983F1A8E -:1059500024183DE000228B5C521C002BFBD1561E0C -:10596000089810282AD1002E47D000243B46085D15 -:105970000F2202400009022B1F4642D3059B002B39 -:1059800005D0012B0ED10794224B7B4402E00794F3 -:105990001F4B7B44D2B29A5C069C6270C0B2185C0A -:1059A0002070079C3846871E02282AD0641C06985F -:1059B000801C0690B4423B46D9D30DE0BE4200D3D2 -:1059C0003E46069C2046324602F0C6FFBF1BA41985 -:1059D0000694002F079C14D0B4420ED9A41BBC42DD -:1059E00000D33C462022069E3046214602F0B8FFF6 -:1059F0003F1B36190696002F03D02978002900D0C6 -:105A000056E600200EB0F0BC02BC01B00847C0460C -:105A10004D3D0000653D00000B3E0000213E0000B2 -:105A200080B50449884204D30349884201D200F07A -:105A300005F880BD0000D0C0009ED0C07A46024963 -:105A4000C91C891A401A70473D5AD0C010B541018F -:105A5000104A0A40430E01210B405B420E4C1C4091 -:105A60005440820E0A4052420C4B13406340C20E17 -:105A70000A4052420A4C14405C40020F0A40524213 -:105A8000084B13406340400F08404142064808401D -:105A9000584010BDE0FFFF3FB2576A3B6D8E502665 -:105AA000FA19A11EDD33423DB362142AF0B587B066 -:105AB00005930492064602910D7800270120002DDF -:105AC00003971BD00298401C0690012000272C460B -:105AD000019721464139E2B2202A5FD3C9B21A297F -:105AE0005CD3FFF7B3FF01460698C25DE020044097 -:105AF000600948407F1C002A1446EAD10599C9195B -:105B0000C91D5A2903994CD8FFF7A0FF002D0ED0CC -:105B100002994C1CFFF79AFF014635701F20284060 -:105B20004840611C761C2578002D0C46F2D13121AD -:105B30003170711C06910599002914D000241A4E69 -:105B40007E44039404990F5D1F2F29D8F55DFFF75C -:105B50007DFF06990D557840641C05998C42F1D360 -:105B60000699091906910624FFF770FF641EFBD100 -:105B70000121484019220D497944069B0446D4402E -:105B80001F2525404C5D1C70541F5B1C002A2246BB -:105B9000F4D1002006998871012102E0019900E00A -:105BA0000399084607B0F0BD28330000F03200002A -:105BB000F0B595B00C46054600200390102A1EDC77 -:105BC0001A99002A03D08E1E262E04D917E0142914 -:105BD00001D0202913D104AE327001206A46082773 -:105BE00082C21060701C03A9052200F00AF8039815 -:105BF000431C0393284621463246FFF757FF15B052 -:105C0000F0BDF0B587B0049301910546104601231D -:105C100083405C1E00270E9900910D9902910C9A09 -:105C2000002A3E4627D04142059100263746029978 -:105C300076188F4004990B781F43491C0491521E1B -:105C400003928642069712DB01990B6802462046B2 -:105C50005C1C0C60059CA4192F46069DE54004467B -:105C600010462540FD543D46361A8642EDDA039A29 -:105C7000002A069FDBD1009900290CD0002E13D0FA -:105C800001990B68024620465C1C0C60911B8F40FA -:105C90000740EF5408E0811B8F4027400021029805 -:105CA000864202DA002F00D10121084607B0F0BD7C -:105CB00001DF704780B584B00190034801A9FFF768 -:105CC000F7FF04B080BDC0463701006080B582B0E8 -:105CD00002486946FFF7ECFF02B080BD3C0200605D -:105CE00080B586B0019002910392034801A9FFF7A5 -:105CF000DFFF06B080BDC0467F03006080B584B082 -:105D00000090019103486946FFF7D2FF019804B063 -:105D100080BDC0462C05006080B588B00090019120 -:105D2000029203930A9804900B98059003486946E1 -:105D3000FFF7BEFF019808B080BDC0463B0700607A -:105D400080B584B00190034801A9FFF7B1FF029824 -:105D500004B080BD7F08006080B584B00190034826 -:105D600001A9FFF7A5FF029804B080BDDB0A00601F -:105D700080B586B000900191029203930348694672 -:105D8000FFF796FF019806B080BDC0462C0B00605F -:105D900080B588B000900191029203930A98049014 -:105DA0000B98059003486946FFF782FF019808B0F9 -:105DB00080BDC0462B1A006080B586B0009001916E -:105DC0000292039303486946FFF772FF019806B0F9 -:105DD00080BDC046EA2E006080B586B0009001917B -:105DE0000292039303486946FFF762FF019806B0E9 -:105DF00080BDC0462E2F006080B58AB00090019112 -:105E0000029203930C9804900D9805900E980690BA -:105E10000F98079003486946FFF74AFF01980AB0B8 -:105E200080BDC046F338006080B586B00190029115 -:105E30000392044801A9FFF73BFF029880B206B025 -:105E400080BDC0466E92006080B582B0034869464E -:105E5000FFF72EFF0198C0B202B080BD4F9F0060D7 -:105E600080B588B001900291039204930A9805903E -:105E7000024801A9FFF71CFF08B080BDBA530060BB -:105E800080B584B00090019103486946FFF710FF88 -:105E9000019804B080BDC046FCA8006080B582B007 -:105EA00003486946FFF704FF0198C0B202B080BD05 -:105EB0003CA0006080B584B00190034801A9FFF7C1 -:105EC000F7FE029804B080BD5864006080B582B0CF -:105ED00002486946FFF7ECFE02B080BD8D680060A5 -:105EE00080B582B003486946FFF7E2FE019802B030 -:105EF00080BDC0466E6A006080B586B00190029198 -:105F00000392034801A9FFF7D3FE029806B080BDB3 -:105F1000D474006080B584B00190034801A9FFF7F4 -:105F2000C7FE04B080BDC046BE9A006080B584B094 -:105F30000090019102486946FFF7BAFE04B080BDA7 -:105F40008183006080B582B003486946FFF7B0FEE8 -:105F5000019802B080BDC046BB84006080B586B0A9 -:105F6000019002910392044801A9FFF7A1FE029853 -:105F700080B206B080BDC046E485006080B582B0C6 -:105F800003486946FFF794FE019802B080BDC04601 -:105F9000B187006080B584B00190034801A9FFF784 -:105FA00087FE029804B080BD7588006080B584B01B -:105FB0000190044801A9FFF77BFE0298C0B204B02B -:105FC00080BDC0468B9C0060F0B585B03A4A12781F -:105FD000002A03D083213A4A7A440BE00A9A452AE0 -:105FE00003D88321374A7A4404E0072907D1832163 -:105FF000354A7A44022300F0B5FC05B0F0BD0192A9 -:10600000029040200393185C0490002822D004984A -:106010000528039D08D1284641302C4979440522A2 -:10602000FEF7E4FD002833D041350027284E7E449A -:10603000049C0321384602F00FFB0221C94341436F -:10604000705C297841402970641E761C6D1C7F1C91 -:10605000002CEED145200399085C4630019A90420D -:1060600010D141311548049C2246FEF7A0FD0720BF -:10607000114988714C80092008700121029800F0B4 -:106080005DFCBAE78321134A7A4402230298B2E7FF -:106090000A4D03222A70681C0F497944FEF787FDD8 -:1060A000281D0E4979440422FEF781FD2878431DFE -:1060B000832102982A469EE73C210020E81F002009 -:1060C000293700001D37000013370000EB360000B1 -:1060D000DF3600008E360000733600006D3600009B -:1060E000F0B581B01D460E460446284600F016FC69 -:1060F00000280ED02068C11C090A6A469170811CD4 -:10610000090C5170411C090E1170001D2060D070E7 -:1061100004E0684604222946FEF749FD174F08228D -:1061200038463146FEF743FD3846083069460422BA -:10613000FEF73DFD00207873022139730121B97308 -:10614000F8733874284600F0E9FB0146201D8625C7 -:10615000002906D029467931C9B20422FEF73DFD57 -:1061600003E069460422FEF722FD044A112320467B -:10617000294600F0F7FB01B0F0BDC046E81F002043 -:10618000F0B583B0029088794B791F020743887875 -:1061900001904B780E781546093DACB2A74204D069 -:1061A000D01FD21F92B297421BD13D46002E08D07D -:1061B00083211C4A7A440223029800F0D3FB03B0E7 -:1061C000F0BD022B18DC012B23D0022B1DD1A8B26D -:1061D0006A461060CB1D002202980199FFF7F4FE79 -:1061E000EDE7E4B2A742E1D0D2B297420546DDD056 -:1061F00083210D4A7A44DEE7032B0ED0C12B04D154 -:1062000083210A4A7A440423D6E783210A4A7A443E -:10621000D1E78321064A7A44CDE78321054A7A44AF -:106220000823C9E7703500000F3500001C35000059 -:10623000E9340000FA3400001835000080B5C16967 -:106240008A784B781B0213430A78812A09D0832A63 -:106250000CD0862A0ED1C91C031D0022FFF740FF77 -:1062600080BDCA1C812100F07DFB80BDC91C1A467F -:10627000FFF786FF80BD000070B50D460146012A7C -:1062800011D1094C20462A46FEF791FC60194026A0 -:10629000721B00252946FEF7A0FC812021463246CC -:1062A0002B46FEF753FD70BDA02100200282C16085 -:1062B0000022C282827642858284C1610262704776 -:1062C000F0B583B00D4604462A20215C20462A30D2 -:1062D00001294AD000293BD12B21002262542346B8 -:1062E0002B332027E15DC91EC9B22646203601297D -:1062F0003ED8218BE28A91423CD94020012D00D02A -:1063000038460290A07E03230126002800D03346A1 -:106310000027012D3E4600D12E46B60033431E46CF -:10632000029B9B1B891A1A46914200DC0A4691196E -:106330000291012D08D1211D2A48042701923A46D5 -:10634000FEF735FC019AA07E002820D0FF302BE01C -:106350002521615C062908D12B21625C002363544E -:1063600023462B33002A03D1BBE72B2000212154E5 -:1063700003B0F0BDFCD10021A176E182197001705B -:10638000B1803160E068E06115480170F0E74020BD -:10639000205CB9B2134B58540120384381B2637E5C -:1063A000104F7B54471C207EB9B20E4B5854E16904 -:1063B000002907D01746BAB29819E38AC918FEF720 -:1063C000F6FB3A46E08A1018E082A07E401CA076D8 -:1063D000029881B203482A46FFF74EFFC8E7C0463D -:1063E0003C210020A021002001462A200A5C012037 -:1063F000002A10D0012A01D100200CE025200A5CDF -:106400000020062A07D12B200A5C01200021002A47 -:1064100001D0084670477047B0B52B210124445481 -:10642000011D0B4D04222846FEF7C1FB00206871B8 -:10643000832028710220A8716920E8717C20C04364 -:10644000801C2872092128462246FFF715FFB0BD9F -:10645000A0210020B0B52B2101244454011D084D7A -:1064600004222846FEF7A3FB0020687188212971C9 -:10647000A871072128462246FFF7FEFEB0BDC046A0 -:10648000A0210020F0B581B004462520205C2646DE -:106490002536002505286AD008784B781B0203436F -:1064A0008878CD782D02054328041843237965792F -:1064B0002D021D43A379E7793F021F433B042B4381 -:1064C000834257D108790B1D658C002D13D02423EE -:1064D000E75C23462433B8424CD1278B401C18700C -:1064E0007B1B501F984200DB18464219628482B21F -:1064F000208D491D23E07C25ED436D1DEFB28325E2 -:10650000B84204D12046FFF7A5FF01252FE08F797F -:10651000497909023943C91CA8422BD1208B8DB27D -:10652000A84227D189B2164D24270020E055121F1A -:106530008A4200DB0A466284154019462A46FFF764 -:1065400073FC2085218B628C01258A420FD3E18C5C -:1065500088420FD106203070002060842A20205C01 -:10656000012804D12046FFF757FF0020307028464D -:1065700001B0F0BD052030701020FEF74DFBC04685 -:10658000FFFF0000F0B589B0044623722020205C94 -:106590002646203603280AD02A25675D25462A3557 -:1065A000002F1BD02046FFF76DFF002814D1D748DD -:1065B00006210172042131707A21C9433A31402207 -:1065C000A1540830E0610020A076E0820120208301 -:1065D000217A2046FFF774FE09B0F0BD042809D1E6 -:1065E0002B2000272754A776E7822F70B7803760CB -:1065F000E068E06108910020012B00D11846870077 -:10660000012039460143079191423BD80390012B69 -:1066100006930492059707D1201D04220899FEF7DE -:10662000C6FA059F049A069BE08A00280CD0012B2D -:1066300024D120461230211D0422FEF7D7FA059FEF -:10664000049A069B002819D003213846084390423B -:1066500018D800910899C8190290C8570F467A2196 -:10666000C9437A3149B28525884225DDA7480421EE -:10667000017231703A3540216554A2E70220384357 -:10668000904202D9A148852193E72120205C9842BD -:1066900046D13078012851D1012B7FD1211D042210 -:1066A00008980392FEF7A2FA059F002876D0974833 -:1066B0000621017203997EE70195012B14D13078F0 -:1066C00001281ED1251D2146123104222846FEF73D -:1066D0008DFA069B002807D0029800780199491C82 -:1066E000C9B2884200D0E8E03078012809D1012BF6 -:1066F00000D080E0029800780199491CC9B2884214 -:1067000079D1079978184078795C0F020743208A7D -:10671000C01E87421FDD7D480099017204216DE093 -:106720007A20C04301460831784A11720421317041 -:106730003A30402160540832E26144E7012B56D1DF -:106740002B2000212154A176E1822970B180316093 -:10675000E068E06140E702980078812805D086284B -:10676000019D51D0832800D097E0012B57D1251DE2 -:1067700067497944042228460892FEF737FA002830 -:1067800007D06449794404222846FEF72FFA0028EE -:1067900045D15E480B21017208992FE0089AD11962 -:1067A000D05DA27E904222D10498079A851AE08A91 -:1067B000228B121A954200DB1546AFB2E26910181F -:1067C000491C3A46FEF7F3F90699012908D1E08AF7 -:1067D000E1690918E08C3A46FFF726FB0699E08448 -:1067E000E08A2818E082A07E401CA0763CE0474862 -:1067F00004210172DFE64548042101723170019ADB -:106800003A3240216254DCE6012B6AD1201D424914 -:10681000794404252A46FEF7E9F9002870D0049847 -:106820000599451AFF1CBD4200DB3D46AAB2E0694E -:1068300002990892FEF7BBF9069B012B06D1E1698C -:106840000020089AFFF7F0FA069BE08421202354E9 -:106850002783E5820020A07620461230211D0422E5 -:106860001D46FEF7A4F92946E08A012901D1218BB2 -:1068700006E0218BCA1C824202D22448032198E6FA -:10688000884204D20020606301203070A4E6022018 -:1068900030702046FFF7D2FC9EE61C48039B037233 -:1068A00004213170019A3A32402162540830E0618B -:1068B0000020A076E08223838AE6144C042220463E -:1068C0002946FEF774F90020607101983A30207172 -:1068D000039AA2710620E07108212046FFF7CCFC44 -:1068E0007AE60A48039A0272042131703A3540214F -:1068F00065540830E0610020A076E082228367E6DC -:1069000002480B210172357079E7C046A0210020B2 -:10691000B62F0000A82F00001C2F000080B50649EC -:1069200079440422FEF762F9014601200022002981 -:1069300000D0104680BDC046082E000080B52A2237 -:10694000835C02462A32002906D0002B08D101219F -:106950001170FFF761FD80BD012B01D10220107085 -:1069600080BD000070B504462A20205C002809D0B4 -:10697000012824D02520205C062820D12B20205C53 -:1069800000281CD12020032525544020215400201C -:10699000A076E261E08223832120215C2546213517 -:1069A00003290DD1084E3078002808D0032100E0DB -:1069B00029782046FFF784FC30780028F8D170BD94 -:1069C0002046FFF77DFC70BD3C21002002490020DD -:1069D0000860024908607047F8210020F421002077 -:1069E00010B50748002444704F21017001218170C7 -:1069F0000221C1700421FFF799FA204610BDC0465C -:106A0000241E002070B582B06D4600246C704F26A5 -:106A10002E700220A8700320E8702C7105212846F2 -:106A2000FFF784FA6C702E700120A870E8700421C2 -:106A30002846FFF77BFA204602B070BD10B582B041 -:106A400001A8002444704F210170012181700221AE -:106A5000C1700421FFF76AFA204602B010BD0000A1 -:106A6000B0B582B0144800240460144804606D4638 -:106A70004F2028706C700520A8700420E870012059 -:106A800028716971AC71012A05DC002A0AD0012A3B -:106A90000AD1042006E0022A03D0032A04D10220EE -:106AA00000E00320694688716846C3710821FFF73A -:106AB0003DFA002002B0B0BDF8210020F4210020F2 -:106AC00010B582B06846002444704F22027005223F -:106AD00082700422C2700122027141718471C471FA -:106AE0000821FFF723FA204602B010BDB0B582B0EE -:106AF0000D466846002444705021017003218170C6 -:106B0000C5704021017144710621FFF70FFA802002 -:106B1000054201D0074800E0054801687F22154082 -:106B20000122AA400A430260204602B0B0BDC0461E -:106B3000F8210020F421002070B582B00D4668468F -:106B4000002444705021017003218170C57080269B -:106B5000067144710621FFF7E9F9354201D0074873 -:106B600000E0054801687F2215400122AA409143B8 -:106B70000160204602B070BDF8210020F421002001 -:106B80008020014201D0064800E0044802787F20BE -:106B900001400120884010407047C046F821002085 -:106BA000F421002010B582B06846002444704F22C2 -:106BB0000270022282700322C27001710521FFF768 -:106BC000B5F9204602B010BDB0B582B01C461546DE -:106BD000684650220270C170202101714471E11C8D -:106BE0008170090A41700621FFF7A0F92846214665 -:106BF000FFF79CF9002002B0B0BD10B582B0684626 -:106C0000002444705023037003238370C17030212B -:106C1000017142710621FFF789F9204602B010BDCB -:106C200070B515460E4604460220002C0FD0D42124 -:106C3000204601F087FE002E01D0B02026509C2077 -:106C40000121215425702046FFF7C0FE0020C0B26C -:106C500070BDB0B504469C2001212154B425605973 -:106C6000002806D04068FEF7DBFE02462179204668 -:106C700090470835CC2DF2D12046FFF7DFFE2046A5 -:106C8000FFF7AEFE0020B0BD0223002A07D000238C -:106C9000022804D8C0000818B42142500023D8B2FA -:106CA000704780B5FFF7AEFE002080BDF0B581B023 -:106CB0000C4605460026B4272846314600F066F902 -:106CC000002807D0E8590068FEF7AAFE02462846C9 -:106CD000214690470837761C032EEDD1002001B0E5 -:106CE000F0BDF0B581B00C4605460026B427284615 -:106CF000314600F04BF9002807D0E8594068FEF70C -:106D00008FFE02462846214690470837761C032E00 -:106D1000EDD1002001B0F0BDB0B504462546A83540 -:106D2000284600F077FB942001212150AE20205A04 -:106D300098216050A820215C1F200840022808D01C -:106D400001280BD000280ED12046294600F02BF94F -:106D50000EE02046294600F0D8FA09E020462946F0 -:106D600000F0AFFA04E0802001402046FFF7BEFEAD -:106D70000020B0BDF0B583B0029204460191002915 -:106D80001CD025469C350027B4262046394600F005 -:106D9000FDF800280DD0A0598069002809D0297875 -:106DA000032906D1FEF73CFE034620460199029ACC -:106DB000984708367F1C032FE7D12FE094202058F6 -:106DC00003282BD1E16D206E81420AD9091AE165B1 -:106DD000814200D301468AB22046029900F0C7FDE5 -:106DE0001CE026469C360025B4272046294600F0A4 -:106DF000CDF800280BD0E0590069002807D0317881 -:106E0000032904D1FEF70CFE0146204688470837C7 -:106E10006D1C032DE9D1204600F0B0FD002003B029 -:106E2000F0BDF0B581B00446009100291BD0274683 -:106E30009C370026B4252046314600F0A7F80028EC -:106E40000CD060594069002808D03978032905D151 -:106E5000FEF7E6FD02462046009990470835761C6D -:106E6000032EE8D14DE094202058022842D1E06959 -:106E7000266AB0420AD9D022A1588919A150801B94 -:106E8000E06182B2204600F064FD33E0A569284647 -:106E9000314601F067FCB5420FD300290DD198208F -:106EA000205826469836854207D200252046294696 -:106EB0002A4600F04EFD35601CE026469C36002533 -:106EC000B4272046294600F061F800280BD0E0598D -:106ED000C068002807D03178032904D1FEF7A0FD4F -:106EE00001462046884708376D1C032DE9D120460E -:106EF00000F050FDA020205CA034012801D100202A -:106F00002070002001B0F0BD70B504469C20012126 -:106F100021544020206220660025B42620462946C0 -:106F200000F034F8002807D0A0594068FEF778FD3B -:106F3000024621792046904708366D1C032DEDD17D -:106F4000002070BD017400207047002070470020B1 -:106F5000704770B504469C20205C032814D100259E -:106F6000B4262046294600F011F8002808D0A05980 -:106F7000C069002804D0FEF753FD0146204688472B -:106F800008366D1C032DECD1002070BD0246002098 -:106F9000022907D8C8001018B4214158012000293F -:106FA00000D10846704780B54A78042A08DD072AD0 -:106FB0000FDC052A14D0062A1BD100F021F81DE0B1 -:106FC000002A10D0012A17D0032A12D100F034F978 -:106FD00014E0082A0AD0092A0BD100F0BDF80DE010 -:106FE00000F094F80AE000F005F907E000F0EBF893 -:106FF00004E000F0E3FB01E000F03BF9002080BD7D -:10700000B0B582B00D46044601A8002101806A880F -:10701000100A052812DC01281CD0022824D00328DD -:1070200037D1D0B2022839DC00285FD0012865D0E2 -:1070300002282ED1B0202058C0680EE006281CD0AF -:10704000072823D00F2824D1B0202058C069002859 -:1070500003D11EE0B02020580068FEF7E1FC024694 -:10706000207C01A990472FE0B420205800282CD084 -:10707000217C002922D0C06A21E0207C002808D190 -:10708000B4202058002804D0406B18E0207C002851 -:107090000ED02046294600F091FB25E0032829D098 -:1070A00004282FD00528F4D1B02020588069D4E7D7 -:1070B000B42020580028ECD0006B00E0806AFEF776 -:1070C000AFFC014601A88847014601A80288002AB2 -:1070D0000AD0E888002807D0824200D3024601A8DF -:1070E0000280204600F020FC02B0B0BDB020205845 -:1070F0004068B2E7B02020580069AEE7B0202058C1 -:107100008068AAE7B02020584069A6E770B5044619 -:10711000888800280BD1C888002808D148887F2695 -:1071200006409C20205C25469C35032803D1204640 -:1071300000F044FB70BD9E202654F1B22046FFF7BC -:1071400031FD204600F01AFC002E02D002202870EB -:1071500070BD0120287070BD70B50D460446AE7834 -:10716000022E1DD29C20215C20469C30032907D092 -:10717000022915D1002E22D066600321017009E09A -:10718000002E12D06068B04219D0C1B22046FFF77D -:10719000A8FD666020463146FFF788FD02280ED123 -:1071A0002046294600F00AFB70BD0221017066608E -:1071B00020463146FFF795FD204600F0DFFB2046D4 -:1071C00000F0DCFB70BD80B5CA88012A0AD19C2280 -:1071D000825C032A09D0022A04D100218160014681 -:1071E000083103E000F0EAFA80BD011D012200F041 -:1071F0009BFB80BDB0B504469C20205CFE22024073 -:10720000022A15D10120E060A420215825460C3522 -:107210000320002905D0204600F0BCFBE1680220D5 -:107220000843E06002222046294600F07DFBB0BD05 -:10723000204600F0C3FAB0BDB0B50D4604466888DC -:10724000012815D1A42001212150287902280CD829 -:10725000C0002018B4214058002806D08068FEF7EE -:10726000DFFB0246204629469047204600F086FB79 -:10727000B0BDB0B50D4604469C20205CFE21014007 -:10728000022919D1688801281AD1A420002121508F -:10729000287902280CD8C0002018B42140580028B2 -:1072A00006D08068FEF7BCFB024620462946904780 -:1072B000204600F063FBB0BD2046294600F07EFA70 -:1072C000B0BDB0B50D4604469C20205C032816D105 -:1072D0002879022813D8C0002018B421405800286B -:1072E0000DD08068FEF79CFB024620462946904759 -:1072F000E888002807D1204600F040FB03E0204644 -:10730000294600F05BFA0020B0BDB0B50D4604463A -:107310002878602202402979202A0FD102290DD82D -:10732000C8002018B4228058002807D08068FEF7D3 -:1073300077FB024620462946904769E06878002896 -:1073400016D001281DD0032862D19C20205C032880 -:107350001BD16888002807D180200843802803D0EB -:107360002046FFF7C3FB297902294ED8C80040E028 -:107370009C20205C032817D0022810D148060AD18F -:1073800046E09C20205C032827D0022807D18020DB -:10739000084380283CD02046FFF7A8FB38E0204671 -:1073A000294600F00BFA33E07F2008400001201846 -:1073B0000546543514308022114200D0054620463F -:1073C000FFF7DEFB0121002800D1014629600222DF -:1073D0002046294600F0A8FA1AE06888002817D14C -:1073E000480612D02046FFF7A7FB287902280CD8C0 -:1073F000C0002018B4214058002806D08068FEF74D -:107400000FFB0246204629469047204600F0B6FA78 -:107410000020B0BD0A7802704A7842708A78CB7832 -:107420001B02134343800A794B791B021343838069 -:107430008A79C97909021143C180704710B50446A1 -:107440008021FFF753FB00212046FFF74FFB10BDC3 -:1074500070B582B00D46044601A900200880694637 -:1074600008702A7860211140002910D0202938D1D5 -:1074700069780A460A3A022A33D302291BD0032923 -:1074800019D02046294600F099F9022029E06978B0 -:107490000B2913D00A290ED0062922D16888000AA8 -:1074A000002221280ED02228114616D101AE3046E6 -:1074B00000F058F80AE0694601220EE0204600F08C -:1074C0005DFA0DE001AE304600F032F80146328838 -:1074D000E888824200D302463280204600F024FA37 -:1074E0000020C0B202B070BDF0B581B00446822168 -:1074F0000326402532462B46FFF7B2FA02272046E4 -:10750000394632462B46FFF7ABFA204639462A4623 -:10751000FFF773FB002001B0F0BD10B504468221D7 -:10752000FFF7CEFA02212046FFF7CAFA002010BD6D -:10753000AC21094A515C0922012905D0002906D154 -:1075400007497944092204E00449794401E0002212 -:107550001146028008467047FC210020E621000009 -:10756000FA210000F0B581B00446AC201349085C54 -:107570002221002819D001281AD11048812103277F -:1075800040263A463346FFF76BFA01250B48294659 -:107590003A463346FFF764FA084829463246FFF771 -:1075A0002CFB08487844222104E00548784401E097 -:1075B00000210846218001B0F0BDC046FC2100201A -:1075C000BB210000A1210000F0B581B0044681215B -:1075D0000326402532462B46FFF742FA0127204674 -:1075E000394632462B46FFF73BFA204639462A46B3 -:1075F000FFF703FB002001B0F0BD000080B50129BA -:1076000003D103480121FEF75BFE002080BDC04688 -:107610005C210020B0B5144601290DD1012540227E -:107620002946FFF7EAFA2846FDF750FB02460348D1 -:1076300021462B46FEF7A6FF0020B0BD5C210020AE -:1076400080B5022903D103487844FDF79FFF00204D -:1076500080BDC04651D7FFFFB0B51446022919D1ED -:1076600002214022FFF7C9FA0B4DA879002811D159 -:107670000220FDF72BFB0246094878442146FDF71E -:10768000CBFE022806D1072028700120A8710348EC -:10769000006868800020B0BD3C210020E42100206B -:1076A0001FD7FFFF70B504468321032540262A46D5 -:1076B0003346FFF7D5F9204629462A463346FFF7D9 -:1076C000CFF9204629463246FFF797FA002070BDD1 -:1076D000002070470020704780B5032903D103487C -:1076E0007844FDF753FF002080BDC046C9D6FFFF98 -:1076F000B0B51446032919D103214022FFF77DFAC2 -:107700000B4DA879002811D10320FDF7DFFA0246BE -:10771000094878442146FDF77FFE022806D10B2058 -:1077200028700520A8710348006868800020B0BD5B -:107730003C210020E421002097D6FFFF1220088082 -:10774000014878447047C046CA22000004200880DF -:10775000014878447047C046CC2200000E200880C3 -:10776000014878447047C046C02200000E200880BF -:10777000014878447047C046BE2200000A200880B5 -:10778000014878447047C046BC2200000E200880A3 -:10779000014878447047C0469E2200000E200880B1 -:1077A000014878447047C0468E2200003920088086 -:1077B000014878447047C046D71F000080B50A785A -:1077C00052B2002A02DBFFF739FE80BD4A78772AE1 -:1077D0000FD0062AF7D14A88194B9A42F3D1CA88AA -:1077E0001221122A00D30A461649794400F09CF867 -:1077F00080BD8A88042A09D1CA882821282A00D372 -:107800000A461149794400F08FF880BD8A88052A1C -:1078100009D1CA889221922A00D30A460B49794499 -:1078200000F082F880BD8A88072ACCD1CA88B221AC -:10783000B22A00D30A460649794400F075F880BDA3 -:10784000EE030000FA1F0000F21F000000200000FD -:107850007820000070B5044623480025D42229462C -:10786000FDF7BBF9214E30460C3004222946FDF7C6 -:10787000B4F91036082230462946FDF7AEF9002C3F -:107880002DD0194C0025D42220462946FDF7A5F914 -:107890001949794420462A46FFF7C2F9174A7A4423 -:1078A00028462146FFF7F0F90120154A7A4421467F -:1078B000FFF7EAF9FF2252320D480E49FEF7F6FCB7 -:1078C0000220104A7A442146FFF7DEF903214022C4 -:1078D0002046FFF792F92046FFF7E3F970BD024812 -:1078E000FFF7B7F970BDC046FC2100203C21002005 -:1078F0005C210020E81F0020321F0000C62000008D -:10790000F02000001021000060210180014878442F -:107910007047C0463A2100000A210180014878449E -:107920007047C0468A210000B0B50C46942102235E -:107930004350D02144508261C261016A914200D813 -:107940000A4693B2002529462246FFF73DF928460C -:10795000B0BDB0B50C46016A914200D80A4693B258 -:10796000002529462246FFF72FF92846B0BD10B55D -:1079700000242146FFF741F9204610BD10B594219F -:10798000042242500024214622462346FFF71CF9D8 -:10799000204610BD10B594210522425000242146F6 -:1079A0002246FFF72AF9204610BD0000B0B5124963 -:1079B0000A780120012A1DD8521E0C235343CB18EC -:1079C0001A8B002A16D01969002913D09B8A002B24 -:1079D00006D194000C190325ED436459E41C09D128 -:1079E000934206D29A0089180322D2438958891CEF -:1079F00000D00020B0BDC046241D002010B50E49A7 -:107A00000A780120012A16D8521E0C235343CB18A2 -:107A10001A8B002A0FD0196900290CD09B8A541E9A -:107A20009C4208DD921E9A4204DD9A00891849683A -:107A3000891C00D0002010BD241D002008480178BA -:107A400000290AD00C224A4380184189028901206A -:107A50008A4203D8FF208A4200D3002040B27047F8 -:107A6000241D0020F0B581B00146164A1078012887 -:107A700026D8401E0C234343D218168B002E1FD04D -:107A80001569002D1CD0022E1AD3948A1346143384 -:107A9000771EA74214DDB61EA6420ADBA600AD196A -:107AA0006D68AE1C0CD0ED1C03D100211980D18271 -:107AB00004E0D482621C1A80002901D000F03EF854 -:107AC00001B0F0BD241D002080B50120FFF7CAFFE2 -:107AD00080BD0000B0B517490878012829D8401E9C -:107AE0000C22424389180A8B002A22D00C69002CF0 -:107AF0001FD0022A1DD38D8A0B461433002D0AD0C5 -:107B0000AA00A2180324E4431259921C11D0CD827A -:107B1000691E19800BE0950064190325ED43645933 -:107B2000E41C06D1044C14191C80521ECA8200F0B9 -:107B300005F8B0BD241D0020FEFF0000F0B581B0A7 -:107B400004460C2060431A490E183069B18A890036 -:107B500040583746143710360321C943884224D889 -:107B6000FDF75EFF31683A8892008958056808463B -:107B7000FDF756FF002D06D00068FDF751FF0146C6 -:107B80002046884711E08068FDF74AFF05463068C7 -:107B9000398889004058FDF743FF4068FDF740FFF2 -:107BA00002462046294600F061F801B0F0BDC0460B -:107BB000241D0020F0B581B02B4D2878012825D850 -:107BC000401E0C2670432A18108B00281ED0116905 -:107BD00000291BD0928A824218D290000858FDF7E3 -:107BE0001FFF806829784C1E6643002810D0A81912 -:107BF0000169808A80000858FDF712FF8068FDF750 -:107C00000FFF01460022204600F030F801B0F0BD21 -:107C1000A819038B002BF9D0828A014614319B1ED0 -:107C20009342F3DB05699600AE1900967768FE1C57 -:107C300013D0BE1CEAD1009E7668B61C09D1521C36 -:107C400096B2B34204DBB600AE197668B61CF6D025 -:107C50000A80C282501C088002E000220A80C28290 -:107C60002046FFF76BFFD1E7241D0020F0B583B05D -:107C700001920C460C221146029041431F4B5F18A3 -:107C80000021398339617961181DFCF7A6FF204670 -:107C90003C4610343D4618353E461636143700280B -:107CA0002AD0FDF7BDFE206029888A008258521C28 -:107CB00006D0491C8AB292008258521CF9D1298000 -:107CC0000198002815D0FDF7ABFE054620683988DD -:107CD000890040580BE0FDF7A3FEA84209D0388880 -:107CE0003080401C388080B2800021680858411CD8 -:107CF000F1D10298FFF722FF03B0F0BD241D002050 -:107D000080B50A49884208D00949884208D0094903 -:107D1000884208D1FFF7DEFE05E0FFF74BFF02E0E7 -:107D20000120FFF79FFE002080BDC04603000080B9 -:107D3000020000800100008010B5014600200029EB -:107D40000FD1084C218BA28A8A420AD22069FDF702 -:107D500067FEA18A89004058FDF762FE4068FDF782 -:107D60005FFE10BD241D002080B503480078401E32 -:107D7000FFF7E2FF80BDC046241D002010B5044679 -:107D800000F00CFC2420604308490818C421052297 -:107D90004254C021064A7A444250BD210122425435 -:107DA000D021044A7A44425010BDC046241D002010 -:107DB0001E1D000059FFFFFF80B500F0FFFA9D2255 -:107DC000002806D003498A5C112A02D1B422024B52 -:107DD0008B5280BD241D00200A80000010B504468F -:107DE000FFF7CCFF2420604304490818CC21044A43 -:107DF0007A444250204600F0A7FB10BD241D00200D -:107E0000C5FFFFFF80B500F0D9FA9D22002806D0FB -:107E100003498A5C102A02D3B422024B8B5280BDE4 -:107E2000241D00200A80000010B50446FFF7A6FFBD -:107E30002420604304490818CC21044A7A44425063 -:107E4000204600F081FB10BD241D0020C5FFFFFF70 -:107E500070B50546FFF788FF0446114E30469C304A -:107E600020222946FCF7A3FE68780146103905292F -:107E70000AD29D20305C0F21014088002058B82193 -:107E800070509C36304670BD022803D00128F8D1CE -:107E9000616800E0E16800200029F2D1F3E7C04604 -:107EA000241D002010B5044600F078FB2420604318 -:107EB0000B490818C42106224254C021094A7A44B9 -:107EC0004250BD2101224254CC21074A7A444250FB -:107ED000D021064A7A444250204600F035FB10BDBE -:107EE000241D0020961C000081FFFFFF29FEFFFFDC -:107EF000F0B587B00E46FFF71FFF06904B4C2046AB -:107F00000C300025022729463A46FCF766FE20463B -:107F10000E30059529463A46FCF75FFE701C04902A -:107F200002D0A06800287DD006984068FDF778FD53 -:107F3000054600F065FE291801220592012871DB33 -:107F400060680590A068029000200390069001955B -:107F50002B468B42039C1A4620D200201A46044628 -:107F600026469D19C01D741C722813D82F781F2F08 -:107F700004DD202F09D02D2F07D003E0092F04D0D6 -:107F80000A2F09D05F2F00D015462A461D198D42B1 -:107F9000E6D303E0344601E09A19741C18198842AC -:107FA00024D2002C069D22D09A4220D00025ED43F9 -:107FB000455D2C2D06DC2E46093E022E16D3202DC3 -:107FC00014D003E02D2D11D05F2D0FD000782C2878 -:107FD00005DC0546093D022D08D3202802E02D28A6 -:107FE00004D05F28069D02D0D41A00E0069D0498B4 -:107FF000002806D00598A84203D10598029A90421D -:108000000AD31B19681C8B4200D328468B4206906A -:108010009FD3401C059005E004480146CC8101989F -:10802000181A8881059807B0F0BDC046241D0020AD -:10803000B0B50446FFF7A2FE094D69682046FFF778 -:1080400057FF242060432818CC21064A7A44425026 -:10805000D021054A7A444250204600F075FAB0BD5E -:10806000241D00201D00000015010000F0B583B0A4 -:108070000546FFF779FE0446374E30469C302022F5 -:108080002946FCF794FD6878102816DC012833D0C7 -:1080900002283BD010285AD12068002841D0B4686B -:1080A000FDF7BEFC03467068B1686A46401C03C217 -:1080B000012C41D82A4A7A4440E00146113903296B -:1080C00045D20F210840401E40003718FD89002D81 -:1080D0003DD06068FDF7A4FCB98940186946086086 -:1080E00034461C348021204A7A4420462B46FDF732 -:1080F000C3FAB82034502AE0FFF758FC01460020AC -:10810000002924D07168002923D020E0FFF776FCF5 -:1081100000281CD07168B068421E0020914216D120 -:1081200017E07168B0686A46106030461C304B1C1E -:1081300080210C4A7A4404E0084A7A4430461C30D4 -:108140008021FDF799FA30461C30B82170509C36DA -:10815000304603B0F0BDC046241D0020DA1A0000EE -:10816000FA110000EB1A00003D1B000080B5174912 -:1081700088420BD01649884213D01649884222D132 -:108180001548416800291CD0491E14E0124988682E -:10819000002803D04968401E884214D1FFF70AFD29 -:1081A00011E00D4841688268521E914202D1FFF7EA -:1081B0008BFC08E0491C41600078401EFFF738FF47 -:1081C00001E0FFF787FC002080BDC046030000806F -:1081D0000200008001000080241D002070B50446CC -:1081E000FFF72CFC01280BD0401C0FD11C4E301D7A -:1081F00000250C222946FCF7F0FCE843706005E0FE -:108200001748001D00210C22FCF7E7FC204600F077 -:10821000C5F92046FFF790FD4068002819D00020DE -:10822000C1432046FFF764FE0D4DA860002807D12A -:10823000281D00210C22FCF7D0FCA868002804D0DF -:10824000401E6968814200D968602046FFF7F0FE51 -:1082500070BD0348001D00210C22FCF7BEFC70BD60 -:10826000241D002070B50546FFF77EFD0446124E22 -:1082700030469C3020222946FCF799FC68780F286C -:1082800006DC01280AD0022812D1FFF7B7FB07E06D -:1082900010280AD011280BD1606807E0FFF786FB91 -:1082A00001460020002903D070BD2068B82170501D -:1082B0009C36304670BDC046241D002010B50446D3 -:1082C00000F06CF9242060430B490818C4210522F2 -:1082D0004254C021094A7A444250BD2101224254ED -:1082E000CC21074A7A444250D021064A7A4442506F -:1082F000204600F029F910BD241D00205619000069 -:108300007DFFFFFF11FAFFFF70B50546FFF72CFD5B -:108310000446164E30469C3020222946FCF747FC86 -:1083200068780F2807DC012812D0022813D00F2804 -:1083300018D1206809E01038022813D29D20305C43 -:108340000F210140880020184068B821705009E0D2 -:10835000FFF72CFB01E0FFF751FB0146002000294D -:1083600000D070BD9C36304670BDC046241D002034 -:1083700010B5044600F012F9242060430B49081898 -:10838000C42106224254C021094A7A444250BD21E8 -:1083900001224254D021074A7A444250CC21064A55 -:1083A0007A444250204600F0CFF810BD241D002032 -:1083B0004219000065F9FFFF65FFFFFF70B5054634 -:1083C000FFF7D2FC0446124E30469C30202229464C -:1083D000FCF7EDFB6878022804D0012809D1FFF7EB -:1083E000E5FA01E0FFF70AFB0146002000290BD067 -:1083F00070BD9D20305CF021084205D00F2108405F -:1084000080002058B82170509C36304670BDC04660 -:10841000241D0020B0B51749884211D01649884262 -:1084200015D01649884222D1F820154C2158E02554 -:108430006059401E8847002819D06059401E11E03D -:10844000E0200F490858FC22895888470FE0F8209F -:108450000B4C2158E0256059401C8847002806D065 -:108460006059401C60512078401E00F00BF800203D -:10847000B0BDC04603000080020000800100008003 -:10848000241D0020F0B581B004460120C6430C4DE8 -:108490002F46E437F8202958E0202858301888471C -:1084A00001C7761C032EF5D12046FFF7FBFC2420E4 -:1084B00060432818D021034A7A44425001B0F0BDED -:1084C000241D002059FFFFFFB0B50446F8200B4DD6 -:1084D0002950E0202B50FC202A502046FFF72CFC8E -:1084E000E435A84206D00649794400222046FFF729 -:1084F000BDFBB0BD2046FFF7C5FFB0BD241D002069 -:10850000B418000080B50023FFF7DEFF80BD000037 -:10851000B0B50C4D2878002811D12846BC30002475 -:1085200024222146FCF759FB28780C2250432818B6 -:1085300010302146FCF751FB2878401C2870C0B24F -:10854000401EB0BD241D0020B0B50446124802787C -:10855000002A0ED0611C91420BD1242161434518A1 -:10856000FCF7AEFCBE2000212952204600F02AF87C -:10857000B0BD01210023002A0A4600D01A46641C1F -:1085800000D019461143012904D14178AA2901D10B -:1085900069214170B0BDC046241D002070B524245F -:1085A000604307490E18FCF78BFC3046BC300025B1 -:1085B00029462246FCF711FBBC20355470BDC0464D -:1085C000241D0020F0B581B004460420FDF7EEFC28 -:1085D00000283CD097283AD0242060431D490C182D -:1085E000C02020582546C0352646BE3600282ED04D -:1085F0002046CC300090C4343088AA27217880B23D -:10860000884224D2FDF79EFC002820D1FDF71CFCF7 -:10861000B84203D1FDF742FCB84218D1286831882E -:108620004901401800990968002902D088470028AC -:1086300007D0012803D12868318849014018FBF789 -:10864000A2FB3088401C308029680029D6D101B0B7 -:10865000F0BDC046241D0020002243088B4274D385 -:1086600003098B425FD3030A8B4244D3030B8B4233 -:1086700028D3030C8B420DD3FF22090212BA030C3C -:108680008B4202D31212090265D0030B8B4219D31D -:1086900000E0090AC30B8B4201D3CB03C01A52413D -:1086A000830B8B4201D38B03C01A5241430B8B4285 -:1086B00001D34B03C01A5241030B8B4201D30B036E -:1086C000C01A5241C30A8B4201D3CB02C01A524195 -:1086D000830A8B4201D38B02C01A5241430A8B4258 -:1086E00001D34B02C01A5241030A8B4201D30B0241 -:1086F000C01A5241CDD2C3098B4201D3CB01C01A5B -:10870000524183098B4201D38B01C01A5241430964 -:108710008B4201D34B01C01A524103098B4201D352 -:108720000B01C01A5241C3088B4201D3CB00C01ABF -:10873000524183088B4201D38B00C01A5241430837 -:108740008B4201D34B00C01A5241411A00D201465C -:10875000524110467047FFE701B5002000F0F0F8E5 -:1087600002BDC0460029F7D076E7704703460B43A9 -:108770007FD4002243088B4274D303098B425FD31A -:10878000030A8B4244D3030B8B4228D3030C8B4246 -:108790000DD3FF22090212BA030C8B4202D312122C -:1087A000090265D0030B8B4219D300E0090AC30B01 -:1087B0008B4201D3CB03C01A5241830B8B4201D3AE -:1087C0008B03C01A5241430B8B4201D34B03C01A97 -:1087D0005241030B8B4201D30B03C01A5241C30A0F -:1087E0008B4201D3CB02C01A5241830A8B4201D380 -:1087F0008B02C01A5241430A8B4201D34B02C01A6A -:108800005241030A8B4201D30B02C01A5241CDD20E -:10881000C3098B4201D3CB01C01A524183098B4259 -:1088200001D38B01C01A524143098B4201D34B0142 -:10883000C01A524103098B4201D30B01C01A5241A5 -:10884000C3088B4201D3CB00C01A524183088B422C -:1088500001D38B00C01A524143088B4201D34B0015 -:10886000C01A5241411A00D2014652411046704787 -:108870005DE0CA0F00D04942031000D3404253408C -:1088800000229C4603098B422DD3030A8B4212D34C -:10889000FC22890112BA030A8B420CD3890192117E -:1088A0008B4208D3890192118B4204D389013AD0BB -:1088B000921100E08909C3098B4201D3CB01C01A90 -:1088C000524183098B4201D38B01C01A52414309A3 -:1088D0008B4201D34B01C01A524103098B4201D391 -:1088E0000B01C01A5241C3088B4201D3CB00C01AFE -:1088F000524183088B4201D38B00C01A5241D9D216 -:1089000043088B4201D34B00C01A5241411A00D296 -:108910000146634652415B10104601D34042002B92 -:1089200000D54942704763465B1000D3404201B511 -:10893000002000F005F802BD0029F8D016E77047C6 -:108940007047C04610B5002200F00AF810BDC046BE -:1089500010B500F031F810BD10B500F07FF810BD73 -:108960000B0010B511001A0000F0D4F810BDC0467D -:1089700030B5032A0CD903000B439B0719D10368B8 -:108980000C68A34215D1043A04300431032AF6D806 -:10899000551E002A0BD0002303E05A1C9D4206D02E -:1089A0001300C25CCC5CA242F7D0101B00E0002098 -:1089B00030BD551EEFE7C046F0B5C64600B50F2ADC -:1089C00041D903270D003E0005430C0003002E4053 -:1089D0002F423DD11500103D2D09AC462D01A84672 -:1089E0008044256867681D605F60A568E7689D60D2 -:1089F000DF6010341F0010334745F2D165460F2366 -:108A00000C2401352D01491913404519144222D077 -:108A10008C59AC5104369C1B032CF9D80324043B1D -:108A20009B0801339B002240ED18C918561E002AEE -:108A300006D00023CC5C1A00EC5401339642F9D1E5 -:108A400080BCB846F0BD0500561E002AF1D1F7E7FC -:108A50000500561EEDE71A00F6E7C046F0B5C6461B -:108A600000B588420CD98B18984209D2531E002AAF -:108A700003D0CA5CC254013BFBD280BCB846F0BDF7 -:108A80000F2A0BD80500561E002AF6D00023CC5C16 -:108A90001A00EC5401339642F9D1EEE703270D009A -:108AA0003E0005430C0003002E402F422CD1150040 -:108AB000103D2D09AC462D01A846804425681F00B5 -:108AC0001D6065685D60A5689D60E5681034DD60C7 -:108AD00010334745F2D165460F230C2401352D0193 -:108AE000491913404519144211D08C59AC51043620 -:108AF0009C1B032CF9D80324043B9B0801339B00E7 -:108B0000ED18C9182240BEE70500561EBEE71A0040 -:108B1000B9E7C046F0B5050083074AD0541E002AC5 -:108B200044D003000322CEB202E00135013C3DD324 -:108B300001332E701342F8D1032C2FD9FF220A40A3 -:108B4000150215432A0415430F2C35D92700103F71 -:108B50003F093E01B4461E001A00103666441560F7 -:108B600055609560D5601032B242F8D10F260C22C4 -:108B700001373F012640DB193700224217D03E1F44 -:108B8000B608B400A4461A001C1D644420C2A242C8 -:108B9000FCD103240136B6009B193C40002C05D0C3 -:108BA000C9B21C19197001339C42FBD1F0BD3400CD -:108BB000F4E714000300BFE72700E0E7F0C04146F8 -:108BC0004A4653465C466D4676467EC02838F0C815 -:108BD0000020704710307CC890469946A246AB46AC -:108BE000B54608C82838F0C8081C00D1012018472D -:108BF00003000A7801311A700133002AF9D1704755 -:108C000010B583070AD00300032102E001330B42B1 -:108C100005D01A78002AF9D1181A10BD0300196876 -:108C20000C4A0D4C8A188A4322420FD15968094ACE -:108C300004338A188A43224208D15968054A04330A -:108C40008A188A432242F1D000E001331A78002AC0 -:108C5000FBD1E1E7FFFEFEFE8080808030B5002A78 -:108C600028D003000B439B0713D1032A11D9134DBE -:108C70000BE0043A002A1DD0114C1C199C432C42D5 -:108C800018D104300431032A03D903680C68A342C5 -:108C9000EFD004780D78A5420ED1012A0AD0012325 -:108CA00006E0C45CCD5CAC4206D101339A4201D0EF -:108CB000002CF6D1002030BD601BFCE78080808056 -:108CC000FFFEFEFEF0B50C00044303000600A407FF -:108CD00012D1032A10D9144CA44666460D68134CD1 -:108CE0001F002C19AC4334421CD10433043A1E003B -:108CF00004313D60032AF0D80024B71806E00D5D6A -:108D0000013A3555BB1A0134002D02D0002AF6D1A4 -:108D1000F0BD0021D418002AFAD0197001339C420A -:108D2000FBD1F5E71E00E7E780808080FFFEFEFEB6 -:108D300030B5050008002B006C18002903D106E0AF -:108D400001339C4203D01A78002AF9D1581B30BD58 -:108D500025303858001976A91488AC17A914873D16 -:108D6000A91487209EC9845ACB02FAB24E1C03680C -:108D7000B3B517C1A4488FBA97F0E3459AC053EA38 -:108D80000100000003C01F02B41600142200203F9F -:108D900076A91488AC209EC9845ACB02FAB24E1C24 -:108DA0000368B3B517C1A4488FBA97F0E3459AC0DA -:108DB00053EA0100000003C01F02B4232102232153 -:108DC00003434104AC25750031323334353637382E -:108DD0003941424344454647484A4B4C4D4E505119 -:108DE00052535455565758595A61626364656667C1 -:108DF00068696A6B6D6E6F7071727374757677786F -:108E0000797AE0E0E0E0E0E0E0E0E0E0E0E0E020EF -:108E1000222426404244484A4EC0C41601010001A3 -:108E2000010101010101000000000000A117D0C0F4 -:108E3000B11CD0C07103D0C0DD16D0C0CD05D0C0EC -:108E40002504D0C00912D0C00914D0C08910D0C0E8 -:108E5000411CD0C0E903D0C02503D0C05502D0C00A -:108E6000626974636F696E636173680071707A72AE -:108E700079397838676632747664773073336A6E1E -:108E800035346B686365366D7561376C00000000C2 -:108E900000000000FFFFFF00000000000C400BF886 -:108EA00007FCC0F3F03CF003FE012D0003000000BE -:108EB000000000000E0000000E0000000100000095 -:108EC000908ED0C0988ED0C000000000FFFFFF0041 -:108ED000008001E6C071383807FC001E8007F003EF -:108EE000CEC1E13870061800000000000E0000003E -:108EF0000E00000001000000C88ED0C0D08ED0C08F -:108F000000000000FFFFFF00000000000C8007F0E1 -:108F100003FEC1FFF03FF003CC0033C00C000000A3 -:108F2000000000000E0000000E0000000100000024 -:108F3000008FD0C0088FD0C000000000FFFFFF00EE -:108F400041110501070000000400000001000000BD -:108F5000388FD0C0408FD0C000000000FFFFFF005E -:108F6000000000001EE01F1C0E03638C19630C0C34 -:108F700087837F8007000000000000000E000000D3 -:108F80000E00000001000000588FD0C0608FD0C0DC -:108F900000000000FFFFFF0048124208040000002C -:108FA0000700000001000000908FD0C0988FD0C053 -:108FB00000000000FFFFFF002184240104000000E6 -:108FC0000700000001000000B08FD0C0B88FD0C0F3 -:108FD00000000000FFFFFF00088A280807000000CB -:108FE0000400000001000000D08FD0C0D88FD0C096 -:108FF00000000000FFFFFF00000000000000C000B4 -:10900000380067E0381C9C037E000F8001000000E0 -:10901000000000000E0000000E0000000100000033 -:10902000F08FD0C0F88FD0C000000000FFFFFF001D -:10903000000030000C80072001CC0033E01C380712 -:10904000FFC3F3F87CFE1F00000000000E000000CC -:109050000E000000010000002890D0C03090D0C069 -:109060004175746F20417070726F76616C004D6154 -:109070006E75616C20417070726F76616C00426138 -:10908000636B005075626C6963206B657973206552 -:1090900078706F7274004170706C69636174696F8D -:1090A0006E00697320726561647900536574746938 -:1090B0006E67730056657273696F6E00312E352EC0 -:1090C000330051756974005369676E006D65737381 -:1090D000616765004D6573736167652068617368DA -:1090E0000043616E63656C007369676E61747572CD -:1090F0006500526576696577007472616E736163AD -:1091000074696F6E00416D6F756E740041646472B6 -:109110006573730046656573004163636570740031 -:10912000616E642073656E640052656A65637400E5 -:109130004F505F53454E44455200436F6E6669720F -:109140006D005468652064657269766174696F6E3C -:10915000007061746820697320756E757375616C39 -:10916000210044657269766174696F6E2070617464 -:10917000680052656A65637420696620796F752797 -:109180007265006E6F742073757265004170707245 -:109190006F76652064657269766174696F6E0041EF -:1091A0007070726F766500436F6E6669726D2074C1 -:1091B0006F6B656E004578706F7274007075626CCD -:1091C0006963206B65793F00546865206368616E50 -:1091D0006765207061746800697320756E757375BA -:1091E000616C004368616E6765207061746800544B -:1091F0006865207369676E207061746800536967E1 -:109200006E207061746800556E7665726966696576 -:109210006420696E707574730055706461746500C4 -:10922000204C6564676572204C697665006F72201A -:1092300074686972642070617274790077616C6C13 -:10924000657420736F66747761726500436F6E7426 -:10925000696E7565004F505F53454E4445525F43FC -:109260005245415445004F505F43524541544500DB -:109270004C0E968C0044656C656761746520746F54 -:109280002025732028666565202564202525290072 -:109290003D666E8B003031323334353637383941E4 -:1092A00042434445460043616C6C20636F6E7472A8 -:1092B000616374202573006F6D6E69004F4D4E49D8 -:1092C00020005553445420004D41494420004F4D47 -:1092D0004E492061737365742025642000252E2A71 -:1092E000482E2E2E252E2A48006F75747075742016 -:1092F000232564005174756D005154554D00716300 -:10930000000000006090D0C06E90D0C07E90D0C0B1 -:109310008390D0C07E90D0C09690D0C0A290D0C094 -:10932000297ED0C01893D0C00000000000000000CB -:10933000D13CD0C000000000000000000000000090 -:109340003093D0C0FFFFFFFFB48ED0C0AB90D0C031 -:10935000BD82D0C04893D0C04093D0C00000000070 -:10936000B490D0C0BC90D0C0DD7DD0C06093D0C0E0 -:109370000000000000000000ED3CD0C00000000034 -:1093800000000000000000007893D0C0FFFFFFFF46 -:10939000248FD0C0C290D0C0BD82D0C09093D0C026 -:1093A0008893D0C0000000002093D0C05093D0C05C -:1093B0006893D0C09893D0C0FDFFFFFFFFFFFFFF71 -:1093C000F73CD0C0000000000000000000000000DA -:1093D000C093D0C0FFFFFFFF1490D0C0A791D0C0B2 -:1093E000B02000207183D0C0D893D0C0D093D0C01B -:1093F00000000000053DD0C000000000000000009B -:1094000000000000F493D0C0FFFFFFFFEC8ED0C03F -:109410002991D0C0BD82D0C00C94D0C00494D0C0DB -:1094200000000000E493D0C01494D0C0FFFFFFFF01 -:10943000133DD0C00000000000000000000000004C -:109440003094D0C0FFFFFFFF1490D0C0B591D0C0C2 -:10945000BC91D0C07183D0C04894D0C04094D0C0DB -:1094600000000000213DD0C000000000000000000E -:10947000000000006494D0C0FFFFFFFFEC8ED0C05E -:109480002991D0C0BD82D0C07C94D0C07494D0C08B -:10949000000000005494D0C08494D0C0FFFFFFFFB0 -:1094A0007C8FD0C0C891D0C0D891D0C07183D0C0BB -:1094B000A094D0C00000000000000000E391D0C0E4 -:1094C00000180020DD81D0C0BC94D0C00000000096 -:1094D000000000002F3DD0C0000000000000000090 -:1094E00000000000D494D0C0FFFFFFFFEC8ED0C07E -:1094F0007291D0C08391D0C07183D0C0EC94D0C0A1 -:10950000E494D0C0000000003D3DD0C00000000049 -:1095100000000000000000000895D0C0FFFFFFFF22 -:109520001490D0C09F91D0C0BD82D0C02095D0C033 -:109530001895D0C000000000AC94D0C0C494D0C036 -:10954000F894D0C02895D0C0FFFFFFFF7C8FD0C01B -:10955000EF91D0C0D891D0C07183D0C04C95D0C00D -:109560000000000000000000FD91D0C000180020A5 -:10957000DD81D0C06895D0C0000000000000000070 -:109580004B3DD0C0000000000000000000000000C3 -:109590008095D0C0FFFFFFFFEC8ED0C07291D0C08D -:1095A0008391D0C07183D0C09895D0C09095D0C021 -:1095B000000000005B3DD0C0000000000000000083 -:1095C00000000000B495D0C0FFFFFFFF1490D0C092 -:1095D0009F91D0C0BD82D0C0CC95D0C0C495D0C022 -:1095E000000000005895D0C07095D0C0A495D0C0A0 -:1095F000D495D0C0FFFFFFFF4C90D0C00792D0C0E1 -:10960000BD82D0C0F895D0C000000000000000006E -:109610001992D0C02092D0C0297ED0C01096D0C060 -:1096200000000000000000002D92D0C03C92D0C08D -:10963000297ED0C02896D0C00000000000000000A5 -:109640006B3DD0C0000000000000000000000000E2 -:109650004096D0C0FFFFFFFFEC8ED0C0E190D0C09D -:10966000BD82D0C05896D0C05096D0C00000000037 -:10967000793DD0C0000000000000000000000000A4 -:109680007096D0C0FFFFFFFF1490D0C04C92D0C0A6 -:10969000BD82D0C08896D0C08096D0C000000000A7 -:1096A0000096D0C01896D0C03096D0C06096D0C07A -:1096B0009096D0C0FFFFFFFF4F505F524554555268 -:1096C0004E000000556E64656C656761746500004E -:1096D00000000000B001000000B0A7000000B002D0 -:1096E0000000003031323334353637383961626347 -:1096F0006465663031323334353637383941424368 -:109700004445466F00900167006985F1D000000074 -:10971000004254430090009000006A805532465F3A -:1097200056329000010990006E006D00FFFFFFFFB0 -:109730000000000009211101210122220000000087 -:1097400009211101000122220006D0F10901A10125 -:109750000903150026FF00750895408108090415C6 -:109760000026FF00750895409108C006A0FF09017A -:10977000A1010903150026FF00750895408108091D -:1097800004150026FF00750895409108C0050F39A3 -:1097900000021810050038B60834A909A0478BFD4F -:1097A000A0768815B66500011E001C100500DF605C -:1097B000DDD88945C74C9CD2659D9E648A9F000078 -:1097C0000306B200770000003D77D0C04D77D0C0CF -:1097D0005D77D0C06D77D0C07D77D0C08D77D0C099 -:1097E0009D77D0C0AD77D0C012034D005300460026 -:1097F00054003100300030007700280000000001E4 -:1098000004000100000000000000020157494E550D -:1098100053420000000000000000000000000000B3 -:109820000000920000000001050001008800000017 -:10983000070000002A00440065007600690063000C -:10984000650049006E0074006500720066006100EA -:1098500063006500470055004900440073000000A4 -:10986000500000007B0031003300640036003300FC -:109870003400300030002D00320043003900370042 -:109880002D0030003000300034002D00300030005A -:10989000300030002D003400630036003500360003 -:1098A00034003600370036003500370032007D00C6 -:1098B000000000000A00000000000306B2000800DB -:1098C00001000000A800080002000200A00014002F -:1098D000030057494E5553420000000000000000AD -:1098E00000008400040007002A00440065007600A0 -:1098F00069006300650049006E0074006500720035 -:10990000660061006300650047005500490044009F -:109910007300000050007B00430045003800300019 -:1099200039003200360034002D003400420032008D -:1099300034002D0034004500380031002D00410076 -:109940003800420032002D00350037004500440049 -:10995000300031004400350038003000450031004F -:109960007D00000000000000E974D0C01B75D0C06D -:109970005174D0C000000000000000004176D0C04B -:109980005976D0C000000000000000000000000078 -:109990000979D0C00979D0C00979D0C01979D0C06F -:1099A000C975D0C01B75D0C05174D0C00000000074 -:1099B00000000000FD75D0C01576D0C0000000008A -:1099C00000000000000000000979D0C00979D0C073 -:1099D0000979D0C01979D0C0A576D0C0D176D0C0D1 -:1099E000D576D0C00000000000000000D976D0C0BD -:1099F000F176D0C000000000000000000000000070 -:109A00000979D0C00979D0C00979D0C01979D0C0FE -:109A10001201100200000040972C01000102010217 -:109A20000301040309040E034C0065006400670091 -:109A3000650072000E034E0061006E006F00200092 -:109A400053000A033000300030003100090260008A -:109A5000030102C0320904000002030000020921D0 -:109A600011010001222200070582034000010705C1 -:109A7000020340000109040100020301010209215F -:109A80001101210122220007058103400001070581 -:109A900001034000010904020002FFFFFF02070565 -:109AA0008303400001070503034000010A0600028A -:109AB00000000040010000000300000000008000E2 -:109AC000200000000100000000000000FFFFFF0078 -:109AD0000000000000000000050102000C0004006E -:109AE0000700000000000000FFFFFF000000000072 -:109AF000000000009C8FD0C005027A000C0004001A -:109B00000700000000000000FFFFFF000000000051 -:109B100000000000BC8FD0C0071000000C008000C7 -:109B20002000000000000000FFFFFF000000000018 -:109B30000880000000000000071100001A008000EB -:109B40002000000000000000FFFFFF0000000000F8 -:109B500008800000000000000300000000008000FA -:109B6000200000000100000000000000FFFFFF00D7 -:109B70000000000000000000050100000E000700CA -:109B80000400000000000000FFFFFF0000000000D4 -:109B900000000000DC8FD0C0050278000E00070036 -:109BA0000400000000000000FFFFFF0000000000B4 -:109BB00000000000448FD0C00711000003008000A7 -:109BC0002000000000000000FFFFFF000000000078 -:109BD0000A8000000000000007120000130080004F -:109BE0002000000000000000FFFFFF000000000058 -:109BF0000880000000000000071300002300800020 -:109C00002000000000000000FFFFFF000000000037 -:109C10000A800000000000002573202825642F25FD -:109C200064290025642F256400252E2A7300000076 -:109C30000300000000008000200000000100000080 -:109C400000000000FFFFFF00000000000000000017 -:109C5000050102000C0004000700000000000000E5 -:109C6000FFFFFF0000000000000000009C8FD0C03C -:109C700005027A000C00040007000000000000004C -:109C8000FFFFFF000000000000000000BC8FD0C0FC -:109C90000510380002001000100000000000000055 -:109CA000FFFFFF00000000000A800000000000002D -:109CB000071100001C0080002000000000000000D0 -:109CC000FFFFFF000000000008800000000000000F -:109CD00003000000000080002000000001000000E0 -:109CE00000000000FFFFFF00000000000000000077 -:109CF000050102000C000400070000000000000045 -:109D0000FFFFFF0000000000000000009C8FD0C09B -:109D100005027A000C0004000700000000000000AB -:109D2000FFFFFF000000000000000000BC8FD0C05B -:109D3000050F1000080010001000000000000000D7 -:109D4000FFFFFF0000000000000000000000000016 -:109D5000071029000C008000200000000000000017 -:109D6000FFFFFF00000000000800000000000000EE -:109D7000071129001A0080002000000000000000E8 -:109D8000FFFFFF00000000000800000000000000CE -:109D90008584D0C0081E00200000000000000000E4 -:109DA000909DD0C0FFFFFFFF0000000000000000FA -:109DB00000000000000000000000000000000000A3 -:109DC0000000000000000000000000000000000093 -:109DD0000000000000000000000000000000000083 -:109DE0000000000000000000000000000000000073 -:109DF0000000000000000000000000000000000063 -:04000005C0D0000166 -:00000001FF diff --git a/src/qt/res/ledger/nanos_stake_delete.txt b/src/qt/res/ledger/nanos_stake_delete.txt deleted file mode 100644 index 9c13e90e02..0000000000 --- a/src/qt/res/ledger/nanos_stake_delete.txt +++ /dev/null @@ -1 +0,0 @@ -python3 -m ledgerblue.deleteApp --targetId 0x31100004 --appName "Qtum Stake" --rootPrivateKey fea057826208738ba33ff0e1ebb8ebf682ab73753afb2d988df03b1b59187d58 diff --git a/src/qt/res/ledger/nanos_stake_load.txt b/src/qt/res/ledger/nanos_stake_load.txt deleted file mode 100644 index a78371e860..0000000000 --- a/src/qt/res/ledger/nanos_stake_load.txt +++ /dev/null @@ -1 +0,0 @@ -python3 -m ledgerblue.loadApp --curve secp256k1 --tlv --targetId 0x31100004 --targetVersion="1.6.1" --delete --fileName :/ledger/nanos_stake_app --appName "Qtum Stake" --appVersion 1.5.3 --dataSize 64 --icon 010000000000ffffffffffffffffff1ffc0ff847f1a7f247f1a7f247f10ff01fe0fff7ffffffffffff --rootPrivateKey fea057826208738ba33ff0e1ebb8ebf682ab73753afb2d988df03b1b59187d58 --path "" --path "44'/88'" --path "45'/88'" --path "48'/88'" --path "49'/88'" --path "84'/88'" --path "0'/45342'" --path "20698'/3053'/12648430'" --appFlags 0xa50 diff --git a/src/qt/res/ledger/nanos_stake_test_app.hex b/src/qt/res/ledger/nanos_stake_test_app.hex deleted file mode 100755 index 9ff678624c..0000000000 --- a/src/qt/res/ledger/nanos_stake_test_app.hex +++ /dev/null @@ -1,2531 +0,0 @@ -:02000004C0D06A -:1000000010B5044662B604F0CDFD002C0DD00120E1 -:1000100000022168814205D1606801280AD1A068E8 -:10002000002803D104F08EFC02E0002004F0AEFCB6 -:10003000002010BD204604F02BFDF0B581B0044631 -:100040000020002A1CD00B780A2B19D89D0001260D -:100050003543954214D82370002B10D00096271DED -:100060004D1C002601210022284602F03BFA01C760 -:100070002D1D761C20788642F4D3009800E030468F -:1000800001B0F0BDF0B58DB04A484B4C0027275267 -:100090004120C0000090275401AE304608F08EFD8C -:1000A0000546B585A8B2002812D0102877D001A83F -:1000B00087850B9805F06EFF02203E49605240484C -:1000C0006F21017045700121204602F0CBFD58E000 -:1000D00001A805F05FFF0B90208802F0CAFD207890 -:1000E000002802D03548334D2FE0354A5078137838 -:1000F0000021364D7D44364E7E446F5CBB4202D1BA -:10010000775CB8420AD0491C0D29F6D36D20000255 -:10011000CBB20D210D2B274D01D116E0254D2D48D9 -:100120007844405C002809D08120830067200002C9 -:100130001279002A09D0E25A052A06D088002649F9 -:100140007944085805F06CFC80471E49605225210F -:100150004901615C00290CD0009BE15CEF220A4060 -:10016000E25409210903884203D05D21164A012384 -:100170005354615B020A124B5A545A185070881C2F -:10018000605305F0FBFE01A9884202D10B9805F0EF -:1001900001FF01A8808D002809D10DB0F0BD01A894 -:1001A00087850B9805F0F6FE102004F035FD04F06D -:1001B00033FDC046060200007C180020AA6F000034 -:1001C000E81F00200A020000001800200A8D00002D -:1001D000138D0000F88C0000E88C0000F0B581B0B1 -:1001E00018480024FF22214604F0F7FC412000902B -:1001F000C600154FBC5515483C525D241448015D9E -:10020000B85D252255017A5D002A06D0002904D068 -:10021000202108430099C90078540C49795A04F008 -:1002200045FF812189007852785D002806D0084872 -:10023000005D002802D0002005F06CFEFFF722FFD1 -:10024000DBE7C046E81F00207C1800200602000003 -:1002500000180020F0B581B0304C7C44204605F0F9 -:10026000DFFB808802F005FD204605F0D9FB808881 -:10027000C0B2254CFF2843D02948784405F0D0FB74 -:100280008088FF2108423BD0204804680546A088AA -:100290001F4F7870000A3870E088F870000AB87054 -:1002A000207A38710934204608F0AAFC02467A7197 -:1002B000B81D214604F07BFC2C682046093008F06C -:1002C0009FFC0546AE1D2734204608F099FCF1B28C -:1002D0007854EE1DF0B23D18204608F091FC02461D -:1002E0002846214604F063FC08480068273008F0DF -:1002F00087FC8019C0B20749074A505209200403FD -:10030000204601B0F0BDC04685690000201D0020D8 -:10031000E81F0020060200007C180020629B0000FD -:10032000429B000010B51148784405F079FB8079B4 -:100330000B490C4A082353520B4930224A700122C0 -:100340008A700523CB7003230B714A7100248C71D2 -:10035000CB7110401B2242400A700920000310BDDF -:10036000060200007C180020E81F0020949A00007C -:10037000B0B51A4C7C44204605F052FB808802F050 -:1003800078FC204605F04CFB8088C0B20F4CFF285B -:1003900019D01348784405F043FB8088FF210842B8 -:1003A00011D06B2004020A4DA87800280BD10D480B -:1003B000784405F035FB80880649074A01235352EB -:1003C0002870092004032046B0BDC046856900009E -:1003D000E81F0020060200007C180020489A000058 -:1003E000289A00000C9A000010B50720C0430A4963 -:1003F0000979002900D00846C4B267200002F82C11 -:1004000008D80548214605F079FC044804490C52F7 -:100410000920000310BDC046E81F002006020000AE -:100420007C180020F0B585B0524E3779564D7D448A -:10043000284605F0F5FA808802F01BFC284605F0F6 -:10044000EFFA8088C0B24C4C042800D98CE001251A -:10045000294681401620014200D185E00497B178F9 -:100460006B200702002080291ED000297FD1701D3B -:1004700000262946324602F035F86A023F49885084 -:100480007F2080000E5428020D543D20C0000E54E1 -:100490003B480E547B2080000E541F2000010E505C -:1004A0000E75CE77334E0420F178002935465ED1A3 -:1004B0000499091A7D229200304FB9542818401D22 -:1004C0003F21C90078500126304602F097FC0920F0 -:1004D0000203387D082849D100233B757F20800026 -:1004E0003946385CFB340028274640D02024684633 -:1004F0001F462B463033029318C008462830314639 -:1005000004923A463B4605F007FC08210391284631 -:1005100005F0F4FB322028706F702A1D029F3846C8 -:100520002146234605F024FC7002144E315828461B -:10053000243002F0B4F92846283031461531039AA8 -:1005400004F035FB1148784405F06AFA69460F60FB -:100550004C600830302321462A4605F019FC094832 -:1005600038213152049F02E0274600E01746B8B216 -:1005700005B0F0BDE81F0020856900007C18002050 -:100580008E040000060200008E990000769800009C -:10059000F0B59FB014460E4602AD69460D600121CC -:1005A00015AF1A463B4602F0FAF908354127002EEE -:1005B00003D1284601F056FD212741222046294635 -:1005C00004F0F5FA38461FB0F0BD0000F0B59DB05C -:1005D000C44E7E44304605F023FA8579BB4CA078A2 -:1005E0000D90304605F01CFA2927C05D01263540E4 -:1005F0000B95002500282A460AD0A07802282A4612 -:1006000006D1B348817901220020072900D0024693 -:100610000C92B548784405F003FAC05D0D9B012BA0 -:1006200029460DD00C990029294609D100282946D0 -:1006300006D0A74881790020072900D00646314618 -:100640000A910127012B384600D12846252149016E -:10065000A04A515CA04EFE36E278002903D0002863 -:1006600001D135462FE16B200502A078022800D980 -:1006700029E1022A11D3032A08D0022A00D022E15C -:1006800096480068406B002807D11CE19348006839 -:100690004021405C022800D015E167200502207946 -:1006A000002800D10FE1012B099202D1601D04F056 -:1006B000EBF808900C98002809D060798000801D24 -:1006C000C0B220180121002201F00CFF1C90874DC0 -:1006D0007D44284605F0A4F9808802F0CAFA28462D -:1006E00005F09EF97C49CD1C8088C0B2042800D951 -:1006F000E9E0012181401620014200D1E3E005F04C -:10070000CDFBAA28744D00D0DDE0651D2846394692 -:1007100002F0DEF90790412006902070671C14ABB0 -:1007200028460B993A46FFF733FF099B0546012BF4 -:1007300014D0032B10D1E9B20EAD38462A4602F090 -:10074000B6F800206946086022464332142132235D -:10075000284603F079F843E0022B34D10EA8142187 -:1007600004914170002105910170E9B2821C384664 -:100770001F46039202F09BF858480068022F17D1D9 -:10078000049F406B00282CD005F04AF901466846CA -:1007900007602746433700223846039B05F008FAD6 -:1007A0000546E8B201281CD1384608F029FA17E0BE -:1007B000C0886946086005984860224643320EA802 -:1007C000162196230AE045480068808800216A4681 -:1007D00003C2E9B2224643329623384602F096F825 -:1007E0000546422025540B98002801D10420607052 -:1007F000EFB2E5192846433014A9202204F0D7F9B6 -:10080000384663303649334B58520D98012830D062 -:10081000079800282DD00C98002847D02425585D33 -:10082000002808D0194620311CA8042204F0DEF963 -:10083000284B00283AD000265E55184620301CA9C7 -:1008400004221F4604F0B3F91C9B2046C83009253A -:10085000274A7A44294604F00FFFD02026540698F0 -:10086000C000395C10220A433A5404F02DF82D03DD -:1008700029E00D95322F354625D82046C83043341F -:1008800021463A461C4604F092F9C82000210D9AF0 -:1008900011540698C000215C10220A432254089883 -:1008A000C0B203F0FFFF092005030CE00920050397 -:1008B0000A98002807D00698C000195C10220A4345 -:1008C0001A5404F00BF8A8B21DB0F0BDE81F0020C8 -:1008D0003C2100207C18002082690000201D00209F -:1008E00006020000EA970000A8970000EC960000BE -:1008F000FA840000B0B5692300218522002807D0C2 -:100900000C480D49085A0D4941180B32002001E0EE -:1009100010461A468BB20A4CE2548A1C054B064D0F -:10092000EA52491C89B2605491B2202004F0BEFB07 -:10093000B0BDC046060200007C180020FEFF00008B -:10094000E81F0020F0B593B00920C701C24D002672 -:10095000EE51C24C285D02281FD0012800D078E15A -:10096000C84FEE51BE48295A002900D155E1BF4871 -:10097000285C0122FD2846D3FE283AD0FD2800D06D -:1009800067E1032900D248E1BF48295CA12080002B -:10099000285C00020843032235E0B14C295B092999 -:1009A00000D23AE1AF4BE85CFD22FC2801D80922D5 -:1009B0000EE0904200D04CE10B2900D22DE1AA4874 -:1009C000281800210A4601F069FDA64B295B0B227D -:1009D0001018884200D920E10A9000200126A3497E -:1009E0002A18525C401C002A21D100240728F7D97C -:1009F0002BE0052900D210E1A348281800210A465F -:100A000001F070FD0522E851022129558F21C9000E -:100A10006850964828188118914C16462A5B921BFC -:100A200004F0C5F8285B801B28530126F5E06918FF -:100A300011AC0822204601F0A8FF8D482818014675 -:100A4000224602F01FF9874B34460497EF183846C8 -:100A500001F032FE0590384601F0FCFB0790384665 -:100A600001F030FC02908348006840210391405C13 -:100A7000002111280891099108460FD17B2081009F -:100A80000691384601F03AFE09903846069901F081 -:100A90006DFE08903846069901F06DFE01903846CB -:100AA00001F032FC1F2211010691695802290ED86B -:100AB00000920390384601F07FFB07990843002815 -:100AC0000A9A3AD006982858012852D8C1E06948B5 -:100AD00000680399405C11280A9A07993B4614D193 -:100AE00018461F4601F068FB3B4607990A9A0843DF -:100AF00000280AD10898099B1843002C01D1059BB6 -:100B0000184300283B4600D1A3E05A480068039FE1 -:100B1000C05D11282DD001200021059A002A00D0A7 -:100B200008460443184601F047FB07990843012C87 -:100B30000A9A1ED100281CD18BE00898099B184303 -:100B4000002C06D00028BDD106982858002807D1CF -:100B50007FE0059B18430028B4D100980001285875 -:100B6000039B002B01D1012873D0002B01D1022857 -:100B70006FD00998089B0343002B6AD10598002881 -:100B8000049F3FD13C48285C00283BD0029B0B438C -:100B900004240320002B00D00446019808430028B9 -:100BA0000CD136482918E0B228182E4A8018142291 -:100BB00004F01CF807990A9A002838D03D20C0009C -:100BC00000291FD0285C00281CD009940BAC1422EB -:100BD000089262700020207028482918A01C03F099 -:100BE000E6FF16212046224601F061FE0998C0B2B8 -:100BF00028181C4940182146089A03F0F7FF0028DE -:100C00000ED00A9A06996858401C6850EA51412053 -:100C1000C000295C10220A432A54304613B0F0BDAC -:100C2000144800684421405C400712D50A9A1448D1 -:100C3000295C00290DD10121295406996858401CCE -:100C400068508F20C0002958491E2950002AE4D03E -:100C5000DFE6012003F0E0FF7C18002084040000A0 -:100C6000760400008A0200008B020000820200006D -:100C700085040000201D00207E0200006A020000A2 -:100C80008D0400007C0400008302000070B59EB05B -:100C90000C4601AD69460D600126002214AB3146B9 -:100CA00001F07DFE0948784404F0BAFE08358179E8 -:100CB0004120314203D1284601F0D4F9212081B2EC -:100CC0002846224601F0F3FD1EB070BD16910000CB -:100CD000F0B59FB0DE4A94786B210E021179002C9A -:100CE00004D0FF2C02D0802C00D098E10A90D94B80 -:100CF000D94F3D20C0000990385C0025002806919E -:100D000012D0F85C00280FD150790125FD21FD2873 -:100D10000AD34A1CD5B205220023A84200D01A46A5 -:100D20000325884200D015460BAE304607F046FF3B -:100D3000B085CA49084208D00BA8002181851598C2 -:100D400005F028F96F20060246E10BA805F022F90C -:100D50001590387DC24E092800D03AE10221C843DF -:100D6000801CC0B2844240D1787F002800D11CE1B1 -:100D70000520C401385D002800D12AE10025582251 -:100D80000A98294603F029FFB1494879002800D183 -:100D90000BE10A9E2336491D2922304603F007FF46 -:100DA000B64839183046FFF771FF3D55B04801216C -:100DB000395434463046AA4D01F038FE002800D19F -:100DC000F3E025204001385C00282E4600D000E1E9 -:100DD000A648042139544120C000395C10220A433E -:100DE0003A54204603F084FDDFE00791F5204000EF -:100DF0000890385C002813D1E8B206990B1A3446E3 -:100E0000FB36002B00DAE4E000216A4611605160F5 -:100E10008F4A1018421D3846283004F07DFF2646C0 -:100E2000787F00282FD08F4C385B069D4119FB3608 -:100E30007D229200914200D9CBE038188A494018AF -:100E40008349491D2A4603F0B2FE385B40193853E6 -:100E5000FFF778FD002804D04120C000385CC006B0 -:100E6000F6D58F20C000385800287D4E0BD1412088 -:100E7000C100795C1022114205D17C4B0324FC5443 -:100E80001143C00039540998385C714A917800299F -:100E900024D0002811D120206946486017A8086096 -:100EA000384694306A494A1D0121069B04F034FFFC -:100EB00067490998385C002850D00898385C0028A9 -:100EC00022D020206946486017A80860172000013A -:100ED0003A1838469430012160233CE000280BD1B9 -:100EE000002168460160416038469430584A521DDE -:100EF000069B04F011FF564A5F48012139525548BC -:100F000039540020107050E0202468461B2109014C -:100F1000791801600A46039244603D462835012154 -:100F2000049100230593284604F0F6FE284604F0B9 -:100F300013FF6846039A14C02846049D2946234699 -:100F400004F0EAFE6846446017A901603846943010 -:100F50003F4A2946059B04F0DFFE3D49787F002883 -:100F600029D04348385C002804D1002158220A982F -:100F700003F033FE3F48006801790A9C6170807974 -:100F8000A07020464C30082104F0B8FE3A4807997A -:100F9000395200202E4908704870787F002811D0FF -:100FA000E01C17A9202203F002FE159804F0F2FFBE -:100FB0000920060333E03048079A3A52002048706F -:100FC00008700A9CE11C17A8202201F059FC002897 -:100FD00028D0159804F0DEFF274C002038533875D0 -:100FE000204D7A5B20483918194803F0E0FD785B02 -:100FF000385304F0C3FF0BA9884202D1159804F0BE -:10100000C9FF1A4801213954164800243C521C4893 -:1010100038180822214603F0E0FD1A483C54B0B2CB -:101020001FB0F0BD0898385C7B218900795C0143D2 -:1010300009983A5C0A20002A05D0090603D101204C -:10104000089978540020387509200603D1E7C04676 -:10105000E81F0020810200007C180020FFFF000034 -:10106000856900007604000082020000840400000C -:101070007E020000201D0020060200006A0200001F -:10108000850400008D04000070B521200001134D7F -:101090002818FFF71DFE04464120C600A85DC006C3 -:1010A00019D50F48295C042904D0032905D103F080 -:1010B000ABFB04E0012129540DE003F07FFB002885 -:1010C00009D1084800212952A85DEF220240AA5503 -:1010D0002975D520C401204670BDC0467C1800206B -:1010E0008404000006020000F0B581B08F20C70024 -:1010F0003D4DE8593D4C295D022901D1401EE85182 -:1011000009210E030028009629D039482818CE015D -:10111000AA598118374C2B5B9A1A03F048FDA8593D -:10112000295B081A28534120C600A85DEF21014021 -:10113000A955FFF707FC002802D0A85DC006F8D526 -:10114000A85DC006009E294C09D503F037FB014677 -:101150000120002945D100202875D520C601295D30 -:1011600002290AD1E859002807D10320285503F0A5 -:101170004BFB002807D0295D0AE0320A0020009BC3 -:101180009E420CD12DE0002129552975D520C6019C -:1011900001200022009B9E4200D01046320A164FCA -:1011A000EB5B164CE2549A1CEA535B1C9BB2E65470 -:1011B000002801D003290FD101200C4968540D48A3 -:1011C00000242C520E4828180822214603F005FD61 -:1011D0000C482C5408482A5A91B2202003F066FF8C -:1011E000002001B0F0BDC0467C180020840400003F -:1011F000820200007604000006020000E81F0020C2 -:10120000850400008D040000F0B585B0744D2F7981 -:101210007C4C7C44204604F003FC808801F029FDCE -:10122000204604F0FDFB6F4EF21C8088C0B20428FB -:1012300000D9D2E0049701273946814016200142A7 -:1012400000D1CAE0A878684A7632802808D0002801 -:1012500000D0C2E03902654B03245C5400211975AB -:10126000EC788023052C59D8012C57D0002874D154 -:10127000581CC1B200208C4200D00746A01E02902C -:101280005A48407F002803930CD118462A30C0B238 -:101290000090019104F002FE0199009A90423246BA -:1012A00000D09AE07B208000504A13461F541F2034 -:1012B000000100221A5001208C4201461E4600D037 -:1012C0001146029BDBB2042B034600D3134619439D -:1012D0003D23DB00F1547077F283454909684023D0 -:1012E000CB5C444972540326744002265E40264378 -:1012F000002E00D01046FF263246EA323B49885481 -:101300001A2B14D8012098403B4A10420FD0E8789D -:10131000052808D004280AD1012005E0802C1CD023 -:10132000812CA3D059E00220324A304988543348F6 -:1013300000242E4F3C54F52040003C5430483818CF -:101340001822214603F049FCEC36BC550520C001AB -:1013500001213954EC78A878039B049FFF21EC31DC -:10136000224E3D22D2009C422BD0B25C002A28D0D3 -:10137000725C002A25D1984223D128790A38C0B25C -:1013800031281ED8687902281BD8012808D1A879ED -:10139000382805D1E879322802D1287A002810D0DF -:1013A00025204001305C00280F4A16D101207054DE -:1013B0004120C000315C10220A43325403F0B8FAD5 -:1013C000049F7D20800037543F20C000691D3150AC -:1013D000022001F013FD0920020390B205B0F0BD18 -:1013E000E81F0020826900008A6A00007C18002043 -:1013F000201D00208E040000800140048F040000A6 -:101400006A020000AA8B0000F0B593B0724C7C44D5 -:10141000204604F005FB808801F02BFC204604F0F8 -:10142000FFFA8088C0B2634F04283ED801252946C0 -:1014300081401620014238D05F4E6B200002B17807 -:10144000002902D0F178002930D1672000023179DB -:1014500007292BD305AC204607F0B0FBA0855749E0 -:10146000084208D005A8002181850F9804F092FD5C -:101470006F2007020EE005A804F08CFD0F90504984 -:10148000087D0A2803D1FB3770790B2811D30F98F8 -:1014900004F080FD4A480021017504F06FFD05A9A4 -:1014A000884202D10F9804F075FD384680B213B01F -:1014B000F0BD44480818741D29220490214603F009 -:1014C00076FB707980002843215C20184418601C4A -:1014D00000262946324601F005F8039064793A481F -:1014E00037490C543D48784404F09AFA8079042135 -:1014F00008420DD1354800684021415C022902D0E4 -:10150000816B002951D0412CC1D1806B0002044372 -:101510002F482B49085C00281DD111AD284603999E -:1015200001F0BDF9281D214601F0B9F97B208000AA -:101530002349085C002804D011A8082100F01AFEF5 -:1015400009E06846066046600846283011AA08236C -:10155000314604F0E1FB0021049D284601F0B8FA71 -:10156000002805D00120014600F03AF8144C09E0AB -:101570004120C000124C215C10220A43225428460C -:1015800003F0C6F925204001205C09210F03002843 -:1015900083D010488168491C81604268914200DA1A -:1015A0007BE75D210122425477E7012C2C46AFD026 -:1015B0006DE7C04685690000E81F0020FFFF0000BE -:1015C0007C1800203302000066020000201D00206D -:1015D0008E04000000180020AE890000D6880000AC -:1015E000F0B5B1B0002818D0039100216846016021 -:1015F0003448354C201827AB0A4601F0D0F97B203F -:101600008000205C00280FD02020694648601FAA77 -:101610000A604120800020180DE02D4B2A4A00204E -:10162000D052692285263BE02020694648601FAAE7 -:101630000A60204628300121002304F06DFB04AF2E -:10164000384604F089FB2025684645601FAE0660D9 -:1016500001243846214632462B4604F05DFB1E48E5 -:10166000784404F0DDF98079400820406946FF2283 -:1016700052320A60486027A8144C31462A46234655 -:1016800001F0C4FA6178C81C114A0F4B9852114AF4 -:101690009A5C61188A707A21CA430B32002603993A -:1016A00000290DD183B2094CE254821C084B064D2F -:1016B000EA52401C80B2265491B2202003F0F6FC7E -:1016C00031B0F0BD330200007C180020E81F00207C -:1016D00006020000660200005C870000F0B581B0E1 -:1016E00067200602284D287901282AD1284C7C44FD -:1016F000204604F095F9808801F0BBFA204604F0FA -:101700008FF98088C0B2214FFF2819D02148784432 -:1017100004F086F98088FF21084211D0FE1E04F0F3 -:10172000BDFBAA280DD16C791B48784404F078F9E8 -:10173000092109038088C0B2844205D10E4600E029 -:101740003E46B0B201B0F0BD3E46FB36082CF8D89C -:1017500000910120A0408B2149000842F1D00F4D9B -:101760007D44284604F05CF9408801F082FA28465E -:1017700004F056F9408820423E46E2D0204600F070 -:1017800079FC009EDDE7C046E81F00208569000067 -:10179000CE860000AE860000928600005C860000C7 -:1017A0006D20000270470000F0B58BB009AD00213C -:1017B00006262846324603F010FA0A200A99014309 -:1017C000297101242846214601F04CFA02202843C1 -:1017D000214601F047FA124F7F44384604F020F9C1 -:1017E000801C2946324604F07BFA6D4620262846A6 -:1017F000314604F083FA384604F012F908302946DD -:10180000324604F06DFA08AD2C70384604F008F941 -:10181000401C2946224604F063FA0BB0F0BDC046D6 -:10182000E4850000F0B581B0017800250091002921 -:1018300018D0441C002701250026204629463246A0 -:1018400000F050FE80B2094988420BD00849884216 -:1018500007D0241D7F1CF8B2009988423546EAD390 -:1018600000E00225E8B201B0F0BDC0461DB10000A5 -:101870001EB10000F0B599B0A94EB778802038436A -:101880006B210D02802800D040E130790B90F47874 -:10189000002F04D1022C02D3802C00D036E1D520B9 -:1018A000C5010C95FE3D04F0F9FAAA2800D02DE1FF -:1018B0000DAD284607F082F9A8859A49084208D05C -:1018C0000DA800218185179804F064FB6F200502A4 -:1018D0000CE10DA804F05EFB1790002F26D04D21DF -:1018E000CA00914C99218D00615B002900D1FAE07A -:1018F000A25A8A4200D0F6E0084600F077FF00289E -:1019000000D1EFE0625B894820187D21890000F05A -:1019100079FF002800D1E5E085482018FFF782FF15 -:10192000002873D000F00EF90546E7E0012C27D817 -:10193000212000017C4D281800275822394603F049 -:101940004CF970790B2800D3CCE07B480068017912 -:101950007A4AA95480797A49685475482818711DC3 -:10196000292203F024F970798000012101437218C3 -:101970005079002C56D0927900021043072252E091 -:1019800099218D00684C615B4D22D700E25B0B9B77 -:10199000D2188A4200D9A6E0084600F027FF0028A6 -:1019A00000D19FE021460024684604604460084658 -:1019B0002830721D0492214605950B9D2B4604F09C -:1019C000ABF9684604604460574894302146049A55 -:1019D0002B4604F0A1F95449C85B08185349401834 -:1019E00004992A4603F0E3F84F4BD85B4019D853CB -:1019F00034700599595A82B2092005034D48914225 -:101A000000D086E002211952747063E04120C000CA -:101A1000215C10220A432254179804F0BBFA0920D3 -:101A2000050373E0062299239C0028538918002897 -:101A300058D0079100F0DAFE002853D04D200894CA -:101A4000C4000A972F532F462835284604F084F9FE -:101A500038469430069004F07FF90994385B089C6E -:101A60000B99491D079A891ACBB21818395B88421D -:101A700038D868460A9F07604760B2180392284624 -:101A800039461D4604F048F96846076047600698E5 -:101A90003946039A2B4604F03FF923480146099C36 -:101AA000085B08182149401803992A4603F07FF87B -:101AB0001D49085B281808530A4637700899515A7F -:101AC00082B2092005031B48914225D10221164B01 -:101AD00019527770154818187D21890000F092FE80 -:101AE00000280BD1179804F055FA0C9D2120000115 -:101AF0000D4908180021582203F06FF804F03EFA4F -:101B00000DA9884202D1179804F044FAA8B219B07E -:101B1000F0BD01211952F1E70121034A1152EDE70D -:101B2000E81F0020FFFF00007C1800208202000058 -:101B30003302000006020000201D002011020000F8 -:101B400012020000F0B5A1B03748384F00243C52D3 -:101B500003AD284607F032F8A8853549084207D07A -:101B600003A884850D9804F015FA6F20040242E062 -:101B700003A804F00FFA0D902021029168464160FD -:101B800019AE0660294F28370125384629463246C6 -:101B9000234604F0C1F8384604F0DEF868460660D3 -:101BA000029B436038462946324604F0B5F8684641 -:101BB000046020481D4908180FAF214622463B46C5 -:101BC00000F0EDFE1D48784403F02AFF80794008BC -:101BD0002840694664220A604860174C3846134F13 -:101BE0003146029A234601F011F86078801C0E49B4 -:101BF00078520920040304F0C1F903A9884202D1F4 -:101C00000D9804F0C7F9212000013818002158224E -:101C100002F0E3FF03A8808D002802D1204621B006 -:101C2000F0BD02F0F9FFC046060200007C1800205B -:101C3000FFFF000033020000E81F0020F6810000D3 -:101C400070B525204001094D285C002801D0084CC2 -:101C500009E04120C600FFF70DFE0446A85DC0065E -:101C600001D502F009FE204670BDC0467C18002058 -:101C700082690000B0B5014669228520002902D0A2 -:101C8000FFF760FF020A0749074B5C5A074D2A55C8 -:101C9000A21C5A52611C89B2685491B2202003F0F0 -:101CA00005FAB0BD060200007C180020E81F0020E5 -:101CB0006D20000270470000F0B589B01E4617463F -:101CC0000A460024E543782A00D987E0002A06D096 -:101CD0000024015D002902D1641C9442F9D30490D0 -:101CE000111B8A2048436421069206F0B5FC034686 -:101CF0005A1C306898423FD9019602950021384617 -:101D00000092059302F069FF059B039406988442B4 -:101D100026D21946039A04980792805C491E0891BE -:101D20001C46395D09020E183D463A2730463946B1 -:101D300006F01CFD4743F11B2F46395539360899EB -:101D40008C4201D8732E04D3611E002C0C46E8DCB3 -:101D500000E02146079A521C06988242059BDAD180 -:101D60000021039A029D019E785C002806D1481C40 -:101D700099420146F8D302E032602FE0084600990C -:101D80008918091A336831608B4227D3131A002B44 -:101D900010DB481E0028059B19DB134878447C188B -:101DA0001E46BB5DC35C635533465B1E491E00295E -:101DB000F5DC0CE08A420AD20A49794414463B5CBD -:101DC000CB5C3B55401C641C33689C42F7D30748EE -:101DD00078440178384602F000FF0025284609B013 -:101DE000F0BDC0460A70000028700000F46F0000CB -:101DF000F0B595B000920F4602900AAC2A21204619 -:101E000006F0A0FD022004430594790001400D2254 -:101E10000A4303924140881D019013250021029836 -:101E20000491405C0690002107200991401A01218D -:101E300008918140069801400791ECB2142C0ED80D -:101E40001520021B60000AA90E183188C81C04293D -:101E500000D808463080521EB61C002AF5D160001A -:101E60000AA9085AFF34072800D82C46E0B21328E4 -:101E700017D814210D1A400005990A180AA90E5AFC -:101E8000138801210027072B084600D83846760022 -:101E90000E2737400743C8431752921C6D1E1E463B -:101EA000EED107980028089A00D102461498400005 -:101EB0000E21014011430AA801850999491C0829EE -:101EC0002546B1D10499491C08292546A7D10021EE -:101ED0000B460A460C46009ED8B240000AAD285A6E -:101EE000240603D1002801D10C4604E0D4B23030DE -:101EF0003055521C01245B1CD8B2039D8542EBD89F -:101F00001106019D02D130213170012200242146A9 -:101F1000CEB2B5420D4622D9361876000AAFBE5B66 -:101F20006D1C002E04D1EEB2019FB742F4D816E02A -:101F30002506009F04D1D4B22E253D55521C012404 -:101F4000DDB26D000AAE755B3035D6B2BD55521CA0 -:101F50005B1C491CCDB2019EAE423546D8D8D0B2EA -:101F600015B0F0BD80B583218900044A5258044958 -:101F70000968496CFFF73CFF80BDC0467C18002013 -:101F8000201D0020F0B583B02B4D00262B4A28469B -:101F9000314602F022FE2846314600F063FE284812 -:101FA0002E52252040012E54264801242C54264828 -:101FB00028180822314602F010FEFF20EC302E5483 -:101FC00022482E542248784403F02AFD4078012804 -:101FD00001D0FFF7E9FB1F48784403F021FD40786A -:101FE000002807D01C48784403F01AFD808800F0D0 -:101FF00040FE02E0FF2000F03DF81848784403F06E -:102000000FFD0078002814D102AD2C7001AE3470A1 -:10201000134F7F44384603F003FD293031462246F2 -:1020200003F05EFE384603F0FBFC2946224603F02F -:1020300057FE03B0F0BDC0467C180020A404000089 -:102040007604000084040000850400008D04000074 -:10205000F67D0000E47D0000D67D0000C07D00001C -:10206000AA7D00004021415C01220A400221114367 -:102070000170704710B582B0014601AC204600F0F7 -:10208000F1FD0548784403F0CBFC001D02222146F7 -:1020900003F026FE02B010BD387D0000F0B58DB013 -:1020A00007464120800032490D180C46284603F0AF -:1020B00053FE00266846066046607720800022189E -:1020C00004232846314603F027FE68460660466032 -:1020D000172000012218202428463146234603F009 -:1020E0001BFE6846066046601920000120490A1858 -:1020F00028463146234603F00FFE0C960B960397B5 -:1021000008377D2084000CAA0BAB3846214600F02E -:102110000DFA002828D00B980C9900266A46166004 -:1021200056600B18083328463146039A03F0F4FD35 -:1021300004AA3846214600F023FB002813D0684645 -:102140000660466004AA1A232846314603F0E4FDDF -:10215000684606604660082328463146039A03F025 -:10216000DBFD012600E0002630460DB0F0BDC04684 -:102170007C180020F0B583B00C4605460026684662 -:1021800006604660412080000A490F181B200001AC -:102190000A1820233846314603F0BEFD6846066023 -:1021A0004660384631462A46234603F0B5FD03B063 -:1021B000F0BDC0467C18002070B504461E4E306845 -:1021C000416B002911D01D4979440322204602F0B9 -:1021D0000DFD012500282CD0194979440322204601 -:1021E00002F004FD002824D030684021405C132810 -:1021F0000CD1144979440422204602F0F7FC00284F -:1022000016D118341049794428220BE00F4979443B -:102210000422204602F0EAFC002809D118340C49B7 -:1022200079440222204602F0E1FC0125002800D07A -:102230000025284670BDC046201D0020BD6B000053 -:10224000AE6B0000976B0000896B0000436B0000D1 -:10225000356B0000B0B50446154800684021405C6D -:10226000132810D1134979440322204602F0BEFC02 -:1022700000281AD11734104979442722204602F049 -:10228000B5FC01250FE00D4979440322204602F0F8 -:10229000ADFC002809D117340949794401252046AD -:1022A0002A4602F0A3FC002800D000252846B0BD35 -:1022B000201D0020F56A0000E66A0000CF6A0000D9 -:1022C000C06A0000B0B504460C480068406B0028A6 -:1022D00010D00B4979440322204602F087FC0125E7 -:1022E000002808D0074979440322204602F07EFCEA -:1022F000002800D000252846B0BDC046201D002083 -:10230000B16A0000A26A0000B0B504461B497944D6 -:10231000032202F06BFC002809D120462330184923 -:10232000794401252A4602F061FC002824D0154991 -:1023300079440322204602F059FC002809D12046A6 -:1023400023301149794401252A4602F04FFC002828 -:1023500012D00E4979440322204602F047FC00289F -:1023600009D143340A497944012520462A4602F01E -:102370003DFC002800D000252846B0BDA96A000019 -:10238000A06A00008A6A00007C6A0000696A000096 -:102390005A6A0000F0B586B0FF2414700468002764 -:1023A0008C421AD20B9E002B01D000241C60002E00 -:1023B00001D00024346005684C1B012C0DDB059214 -:1023C0002A46551C056014784E2C5FD804954C2C79 -:1023D000039704D22746049D45E03C4659E0002778 -:1023E0004E2C26D04D2C0DD04C2CF4D102943746D7 -:1023F000049C0E1B0024012E3E464ADB951C056002 -:1024000057782FE002940196049C0E1B0024022EA4 -:1024100015463EDB009300231C461F46049AD65CFB -:10242000E4B2A640F7195B1C0834022BF7D1ED1C6F -:1024300015E002940196049C0E1B0024042E154600 -:1024400027DB0093002423462746049A165DDBB25F -:102450009E40F719641C0833042CF7D16D1D0560EC -:10246000009B019E029C491B002915DB0495254613 -:10247000B942039C0DD3002B01D004991960002EA2 -:102480002C4600D037600168C919016005980470B6 -:102490000124204606B0F0BD039CFAE7F0B581B0F8 -:1024A00000920722D34308240029224600D01A466E -:1024B000002900D10C4600252946465D7F2737407C -:1024C000002D334600D13B46009F002F00D01E4612 -:1024D000E3B29E4071189C186D1C022DEDD1084688 -:1024E00001B0F0BDF0B581B000920722D3430822BD -:1024F000002900D01A461824002900D10C460025D6 -:102500002946465D7F273740002D334600D13B46A4 -:10251000009F002F00D01E46E3B29E4071189C1809 -:102520006D1C042DEDD1084601B0F0BDF0B5044698 -:1025300000201060186000291FD02578FD26FC2D92 -:1025400001D8012710E0032917D3B54215D1601C2B -:10255000002426462546075DF6B2B7407D19641C67 -:1025600008360327022CF6D115601F601068C319C6 -:10257000012000228B4200D91046F0BDF0B585B095 -:10258000144602460020FD26002B029608D00023A8 -:1025900000291BD01578B54205D201212B4616E043 -:1025A0000B46014613E0032910D3B54219460ED15C -:1025B000561C00252F462B46715DFFB2B940CB1843 -:1025C0006D1C08370321022DF6D100E01946029D4B -:1025D000AD1C04AE357055180395D2185518002B54 -:1025E00017D0002637466846066003A804AA294685 -:1025F0003346FFF7CFFE00280AD004A80178781CE4 -:10260000A14200D038460399A9420746EBD100E029 -:10261000384605B0F0BDF0B585B002920027FD2226 -:10262000002B08D0002300291BD00478944205D247 -:102630000121234616E00B46394613E0032910D347 -:10264000944219460ED1441C00252E462B46615D4E -:10265000F6B2B140CB186D1C08360321022DF6D11D -:1026600000E01946921C04AC227042180392C01874 -:10267000451802980128019716DB002B019F13D003 -:102680000B9C0A9E00276846046003A804AA2946FA -:102690003346FFF77FFE002806D07F1C0298874252 -:1026A00002DA0398A842EED1012002998F4200D0AD -:1026B000019805B0F0BD000070B501464A780123CD -:1026C00000246A2A184600D020460B4D2D6840266B -:1026D000AD5D022D00D023461843022D0AD16A2A8F -:1026E00008D00020002A05D18A78012000216A2A1A -:1026F00000D0084670BDC046201D002080B5C12214 -:1027000000F002F880BD0000F0B581B015460E461D -:102710000746FFF751FD0024002804D13846FFF793 -:1027200099FD002802D0204601B0F0BD0E48006897 -:102730004021405C7978022807D16A2905D0002918 -:1027400007D1B8786A28EED003E06A29EBD00228D6 -:10275000E9D00123384631462A46FFF70FFF00240F -:102760000128E0D10446DEE7201D002080B5C2220A -:10277000FFF7CAFF80BD80B5C422FFF7C5FF80BD4B -:10278000F0B585B0144600270497039703AA6B465B -:102790005A6004AA1A60022201263346FFF73BFF63 -:1027A00001283D4600D1054604990029304600D154 -:1027B000084605400398142800D03E463540002DB9 -:1027C00011D076206070192020701422E2707720DA -:1027D000C64330462130A070201D02F0E8F92436AF -:1027E000667688202076284605B0F0BD0146012097 -:1027F0000023F629024600D01A46B42900D0184614 -:1028000010437047B0B501240023F62A254600D0B6 -:102810001D46B42A00D01C462C438A422BD8002CDB -:1028200029D0F62A03D1B421415C412923D10022C9 -:1028300044231146C45CD2B2944061185B1C083238 -:10284000482BF7D100238A0715D100234C241A46C0 -:10285000055DDBB29D40AA18641C0833502CF7D1EB -:10286000064B012000249942034600D82346002A43 -:1028700000D0204603401846B0BDC0465BAC826025 -:1028800070B50023002A08D00023521E94B2055DC3 -:102890000E5D6E403343002CF7D1D8B270BD01708D -:1028A0000A0A42700A0C8270090EC1707047F0B5B6 -:1028B000A3B0164603AC202522462B4603F058FA57 -:1028C0000BAF384603F03CFA142069460E604860AE -:1028D0000121384622462B4603F01EFA23B0F0BDF4 -:1028E00070B588B014466D4620262A46334603F05C -:1028F0003FFA284631462A46334603F039FA042285 -:102900002046294602F053F908B070BDF0B58BB0EF -:102910001D4614460346109E02270120FF2E00D8B4 -:1029200007461198002808D014203843C2B202A8E4 -:10293000194602F03CF9FFB20EE0FFB202A8C2193C -:102940001846FFF7B4FF300A04D002A84670310AD7 -:10295000017001E002A806701421394302AEF21999 -:1029600014323046FFF7BCFF01951821394301AB03 -:1029700030462246FFF7A0F9002803DB01A80088B3 -:102980000BB0F0BD012002F047F9002A06D0491E25 -:102990008B5C0370521E401C002AF9D17047F0B5C1 -:1029A0008DB0174606780B2E3CD201910293002E73 -:1029B00013D0401C0021182200252B46445DD2B2C2 -:1029C0009440E3186D1C083A042DF7D18A0003AC3B -:1029D000A350491C001DB142EDD102F007FD68462D -:1029E0000760212703AD3846294632462B4603F0BF -:1029F00037FA202238462946029C234603F0DCF9A8 -:102A00000198002805D0129921200123224603F0C5 -:102A1000E3F902F0EBFC03A80021202202F0DDF82C -:102A20000DB0F0BD022002F0F7F80000F0B58DB057 -:102A3000024610780B2843D2012600283DD002968A -:102A40000191521C0024182500273E46D35DEDB2AB -:102A5000AB409E197F1C083D042FF7D1A30003ADA6 -:102A6000EE50641C121D8442EDD10528029E24D133 -:102A70000126F207039B53402C2B03D0542B01D08B -:102A8000312B1AD110490B681C88002C06D0049DEC -:102A90005540A54202D059888D420ED16432059925 -:102AA00091420ADC06990198814206D1074A079BA8 -:102AB00001260021934200D80E4630460DB0F0BDED -:102AC000022002F0A9F8C046201D002050C30000DB -:102AD000F0B58DB002461F4803681C880120002C09 -:102AE00033D01078022801D208462EE001910293DB -:102AF0000B282CD2521C0025182600273B46D15DFE -:102B0000F6B2B140CB187F1C083E042FF7D1A900C4 -:102B100003AE73506D1C121D8542EDD10122D30707 -:102B2000039858402C280299019D04D0542802D0C3 -:102B30003128284609D1049D5D40A542104604D0A5 -:102B40004A88012000219542CED10DB0F0BD02206F -:102B500002F062F8201D0020F0B585B004920C460A -:102B600002780B2A4CD2202121700121002A3DD06D -:102B70000499891E0191461C0023012102920393AE -:102B8000182000221546B35CC0B283405D19521C68 -:102B90000838042AF7D1C9B26018049A511A0122E0 -:102BA000D2072B469343184A7A4402F065FD274624 -:102BB0002046049906F0BCF8C1B2361D019A914234 -:102BC0001BDA002D039B01DB3C4603E027223C4639 -:102BD0006254401CC1B22F226254411CC8B2002270 -:102BE00022545B1CD8B2029A9042C8D3C8B2401E8D -:102BF00000212154C0B205B0F0BD032002F00CF852 -:102C0000022002F009F8C04619620000F0B587B052 -:102C10001C4617460591064602F0E8FB0020069088 -:102C200006AD6846C5600C998160446007600D98E8 -:102C3000002801D00A4900E0084903223046059BDC -:102C400003F0DAF82878C00703D020780121014387 -:102C5000217002F0CBFB07B0F0BDC04601040000BC -:102C6000010600000A020A43FF21090251400180C7 -:102C7000704780B5FF218143000A814201D003F0F3 -:102C800025F880BDF0B5002307241E46155D0F5DB5 -:102C9000F619751905550126FF2D00D81E46671E29 -:102CA000002C3C46F2D101200021FF2D00D808461F -:102CB000F0BDF0B581B0002607240096155D0F5DCC -:102CC000330604D0AF4204D97F1E002303E0009BEB -:102CD00001E0FF373346BFB27E1B06550126AF42E7 -:102CE00000D31E46631E002C1C46E7D1F0B201B093 -:102CF000F0BD000070B582B0044601263002114DCF -:102D0000285C30420DD03F20C0002A580021684680 -:102D10000160416028462830234602F0FDFF300262 -:102D2000285C80070BD53F20C0002A580021684648 -:102D30000160416094352846234602F0EDFF02B061 -:102D400070BDC0467C180020F0B581B07D208600A3 -:102D5000294DA85D002848D03F20C700E8590478D5 -:102D6000FC2C05D801252846FFF7C4FFFF2031E0E1 -:102D7000FE2C19D0FD2C3BD10120FFF7BBFFE859F9 -:102D8000411CE951A95DFF31A955C9B201292CD9CE -:102D900041780091847802252846FFF7ABFF240292 -:102DA00000980443FE2015E00120FFF7A3FFE85937 -:102DB000401CE851A95DFF31A955C9B2032914D9B6 -:102DC00000210A46FFF78EFB044604252846FFF73C -:102DD00091FFFC2008490A46D1594919D151915D0A -:102DE00040189055204601B0F0BD012001F014FFBD -:102DF000022001F011FFC0467C180020F0B5BFB0E2 -:102E00000646E948784402F00BFE857933AC20464B -:102E100005F0D4FEA085ED0801273D4084B2002CCA -:102E200001D000F065FC33A803F0B4F83D90002D0C -:102E3000199700D119951B951DA8C01D189025A89C -:102E4000011D169128301790F1481C961A970746D5 -:102E50006AE2072800D067E23C69002C00D161E2F9 -:102E60007D208500785D002801D100F030FC84428F -:102E700000D30446002CE64F01D100F028FCE0B25C -:102E8000FFF738FF3F20C000395809193950785DE5 -:102E9000001B78553869001B386145E24E7834468E -:102EA000083CE1B2302901D900F01FFCB11C11919E -:102EB000C9B2884201D200F018FCD648784402F02A -:102EC000AFFDD349149D49596A46566025AB059319 -:102ED00013608A1C08302021234602F059FFCC4899 -:102EE00040598019811F08220598FFF7C9FC002866 -:102EF00000D0FAE3C64D149EA8593D21C9006A5C72 -:102F0000002A0DD03A22825C3223C254A859401DB7 -:102F1000A851EA5DF332EA55695C012200293DD1EE -:102F2000811C25AE3046224601F041FE3078322821 -:102F300000D0DAE3B6480546149EAC591698A8515D -:102F40002420FFF7D7FE11996018A851E85D401AB8 -:102F5000E8552F461DA808221799FFF716FD0020F7 -:102F600001460246189E735C7C18257F5219D318BF -:102F700023770122FF2B00D80246491E0C46083455 -:102F8000F1D10125FF2B00D885E0AEE33D20C00044 -:102F90009F49085C0022002800D1A6E31392012675 -:102FA0003046FFF7A7FE9A4D14996858421C6A50A4 -:102FB000E85DFF30E855C0B2232800D895E3F5203E -:102FC0004000285C002826D034022E552420FFF72C -:102FD00091FE00200C942855149C29592431295124 -:102FE000E85DDC30E855C0B2072800D87DE30F204B -:102FF000400128180822039201F0D9FD0398FFF739 -:1030000079FE0C982E54285908302851E85DF83084 -:10301000E855139D3FE0002168460160416017209C -:10302000000128182424234602F076FE2046FFF7EC -:1030300061FE1498295824312950E85DDC30E855A8 -:10304000C0B2072800D850E31DA80822FFF79DFC56 -:10305000002001460246189B5B5C6D4C6418257F7E -:103060005219D3182377FF2B324600D80246491E47 -:103070000C460834EFD1FF2B139D00D935E308200F -:10308000FFF738FE62480146149A88580830885085 -:10309000C85DF830C8553D20C0005D4A105C00286E -:1030A00002D10120010250541C9E159CFFF74CFEDA -:1030B000574F3861022171403D22D200BB5C2B4347 -:1030C0000B430022002B214600D0114600281A9AFB -:1030D00000D104460C4054401B98002802D1002C1B -:1030E00000D102E3022038757D25AC00385D002850 -:1030F00000D1ECE2396901291A9B20D13F20C6009A -:10310000B859007801210022AE2800D11146199A41 -:103110001143012906D101210022AE2800D1114618 -:103120005940F9770120FFF7E5FDB859401CB85127 -:10313000385DFF3038553969491E39611C9E0029B8 -:1031400017D04D1EC0B2854200D30546002D304F2A -:1031500000D1BCE2E8B2FFF7CDFD3F20C0003958F6 -:1031600049193950385D401B38553869401B386162 -:10317000DAE0022E1ED13D21C900795C002915D06C -:10318000F5214900795C002914D0002168460160CE -:1031900041600F2040013A1838462830082302F0D9 -:1031A000BBFDA800385C05E0B86F000001210902F2 -:1031B00003227A54C0B2032800D896E2F5204000DA -:1031C0003D21C900795C00290ED0385C00280BD164 -:1031D0003F20C0003A5800216846016041603846EF -:1031E0002830042302F098FD0420FFF783FD3F20E0 -:1031F000C0003958091D3950385DFC303855012060 -:103200003875B868401EB860F868401CF8608BE0FC -:103210007C180020006F0000F5204200B95C3D25BD -:10322000E800385C00284FD000294DD120266846A0 -:10323000466025A909910160172000013C180B94F4 -:10324000012104910023089320460F92099F3A46DA -:103250000E9502F061FD204602F07EFD6846076093 -:1032600046602046049D29463A46334602F054FD06 -:10327000684646601DAF0760ED4C2834204629465D -:103280003A46089B02F048FD204602F065FD68467C -:1032900007604660204629463A46334602F03CFD28 -:1032A0000B980999324601F082FC19200001E0498F -:1032B00008183946DE4F32461C9E01F078FC0F9804 -:1032C000395C0E98C000385C002822D0002920D03C -:1032D000D848385C00280BD1002168460160416065 -:1032E0001B2000013A1838462830202302F014FD34 -:1032F0000A20387518E0052816D17D208400385D35 -:10330000002800D1E3E13D69002D00D01BE7042037 -:1033100076E709213975002806D03846283002F0B2 -:103320001BFD01E008203875397D00E03975C8B211 -:10333000042807DC02286EDD03282AD00428F3D1F4 -:10334000B86836E0062800DDBBE1D4D17D208400DA -:10335000385D002800D1BAE1032800D8C5E1042077 -:10336000FFF7C8FC3F20C000E74F3958091D39500E -:10337000385DFC3038550821FF221042D6D0012498 -:10338000250200207855FFF7DFFC7C5538610721C6 -:10339000CCE7022E00D13FE77D208000385C00287A -:1033A00000D194E1FFF7D0FC0021B860F96004215E -:1033B000397506210028B9D07D208400385D0028A9 -:1033C00000D184E1072800D88FE1012ECE4F11D122 -:1033D000012040023858F96881420BD13F20C000DB -:1033E000395838461530082201F0E1FB7F20800073 -:1033F000012139540820FFF77DFC3F20C0003958D7 -:1034000008313950385DF8303855FFF79DFC386188 -:103410000520387571E7002806D0012802D002285F -:1034200082D161E6B868E0E00026BE60FE603E61E1 -:10343000384615300822314601F0CFFB3D4628358D -:10344000284602F089FC3C469434204602F084FC75 -:103450003D20C000385C00283AD0012000023E54D4 -:10346000F5204000385C00282DD068460660466094 -:10347000772080003A1804232846314602F04CFC9D -:10348000684606604660172000013A18079220201F -:10349000069028463146069B02F03EFC68460660D0 -:1034A0004660192000013A1828463146069B02F072 -:1034B00033FC684606604660602320463146079A22 -:1034C00002F02AFC04E017200001381802F044FC46 -:1034D0007D2010908600B85D032800D805E13F20CC -:1034E000C5007959772080001290381804240A907A -:1034F000224601F05CFB2046FFF7FCFB7859001DDB -:103500000D957851B85DFC30B8558049795C00293B -:1035100017D0C0B2032800D8E7E07B4F0D9D795942 -:103520004920000138180424224601F040FB2046BF -:10353000FFF7E0FB7859001D7851B85DFC30B855B5 -:103540001FE0734800684021405C16280A9C18D888 -:10355000012181406F48014213D0002120460A46D4 -:10356000FEF7C0FF00280CDA002120460A46FEF7CD -:10357000B9FF6949884204DB109880006249085C01 -:10358000C7E7634800684421415C890718D5007A81 -:10359000022806D0042813D15B481299405C012808 -:1035A0000ED8594CA05D032800D89EE00420FFF7F8 -:1035B000A1FB0D996058001D6050A05DFC30A05526 -:1035C000FFF7C2FB504FB860252149011C9E022E17 -:1035D000524A08D1795C002905D05168002900D1F0 -:1035E0005060002111600121397500281DD07D2017 -:1035F00039468700C85D002869D00124022E1BD0FF -:10360000012E254600D051E523286ED92420FFF74E -:1036100071FB3F20C0003C490A461158243111502B -:10362000D05DDC30D055012540E5032038757BE6C0 -:103630007C1800208E040000012856D93F21CA00C2 -:103640001492314989580A78022A159400D19DE4D0 -:10365000012A00D122E4002A47D13D20C0002A4996 -:10366000085C002841D12E4C7C44204602F0D8F959 -:103670008088FFF7FEFA204602F0D2F98088C0B2B7 -:10368000042806D0022804D001282ED11B98002837 -:103690002BD01D4C149D6059401C6051E05D401EB4 -:1036A000E055C0B2232820D92420FFF723FB60591E -:1036B00024306051E05DDC30E0550120A07700252A -:1036C000E9E401460839032901D3FFF7C2FB02F000 -:1036D00055FC33A9884202D13D9802F05BFC33A827 -:1036E000808D00280DD13FB0F0BD012001F094FA8B -:1036F00033A8002585853D9802F04CFC02480575ED -:10370000204601F089FAC0467C1800208E04000093 -:10371000201D0020800140000300008000180020D0 -:1037200054670000F0B581B000900B0901221340EE -:103730005B42194C1C40CD0815406D42174E2E407F -:103740004701774067404C091440644214482040C8 -:1037500078408E0916407642124F37404740C809DC -:1037600010404042104A02407A4098272F40009D66 -:10377000ED0E49012943C9B2794079251D404D40DC -:10378000F32121406940AE2333404B401E210140CC -:103790005940104601B0F0BDE2996DB7618EBCF2A0 -:1037A000C4B35F3EA8E2AB2E70E4434FF0B581B0E6 -:1037B00015460E4607463C78012000210090FFF791 -:1037C000B1FF002C12D07F1C1F22224042403C78C7 -:1037D0001046FFF7A7FF7F1C002CF5D106E0FFF78E -:1037E000A1FF0246307850406D1E761C002DF6D1A8 -:1037F0000824FFF797FF641EFBD1009A504001B0E8 -:10380000F0BD000070B514460A4601460D487844E4 -:10381000FFF7CCFF23220546D54020239E1A0B46F6 -:10382000B3402B431646203E0D46F540002E00DAED -:103830001D461F232B402370531F641C002A1A4669 -:10384000E9D170BD4E560000F0B599B01D46034653 -:10385000002017901690107014296FD11E99002027 -:10386000002904D0012969D10192082000E00192C9 -:103870000CAF3870781C1422194601F098F9152104 -:103880000026324630463B78000218431346083380 -:103890007F1C491E0224E443A2420EDB0D32134674 -:1038A0000A3B0446DC401F23234002ACA355521FB1 -:1038B000761C092AF3DC521F00E01A460029E2D1E7 -:1038C000002A019F07D00521891A88401F21014045 -:1038D00002A88155761C02A816AA3146FFF792FF6E -:1038E0000020002E394611D002A801780023144A86 -:1038F0007A44202920D2581CAB421DD202ACE45C91 -:10390000145DFC54B0420346F3D3391800220D4B2A -:103910007B4416AC2478202C0ED28418641CAC4254 -:103920000AD816ACA45C1C5D8C54521C082AF0D337 -:1039300000238B54801801E00020387019B0F0BDCE -:10394000785500005855000070B594B014460A46EA -:10395000014601A8FCF771FB01460020002912D0A6 -:1039600001A8027800216B461960011D21250CAECB -:103970002846334602F074FA202228463146234670 -:1039800002F01AFA012014B070BDF0B59DB01446D3 -:1039900013AAFFF7D9FF0025002811D021266F4672 -:1039A00013AA0125304639462B4602F015FA08378E -:1039B0003846FEF757FB20463946324601F0F7F805 -:1039C00028461DB0F0BD0000F0B58BB00746119C35 -:1039D000012F17D0129E032F12D1212205AF0846C6 -:1039E00011463A46FEF763FF00256846056014213C -:1039F000384622463346FFF727FF002836D136E007 -:103A0000022F25D10393049405A8142545700024A2 -:103A10000470861C2122084611463246FEF747FFF5 -:103A2000022F0DD11099002908D0684605600022A8 -:103A30000498334602F0BCF8002817D1002516E0A0 -:103A40006846039912C005A816219623049D09E033 -:103A500025460024684614C00648301883B2212247 -:103A6000084611462A46FEF751FF2C5401252846E8 -:103A70000BB0F0BDFFFF000070B59AB00E460446D3 -:103A80002069002500282AD0217BA068401CFF3136 -:103A9000C9B211AA00252B46FFF777FF00281ED0D8 -:103AA000F388B288A0680078716B33256E46B560E4 -:103AB00004AD22C611A9FFF787FF002500280ED00C -:103AC000246904AD284605F09BF8421C284621468F -:103AD00004F04EFF01250021002800D00D462846A5 -:103AE0001AB070BDF0B585B00A4606460020B07326 -:103AF00034460E34317B082927D803AF00210191C9 -:103B00000825384602922A4601F067F8327BA81A47 -:103B10003818B16801F04BF8029D2735284605F0AA -:103B20006FF8C6B220462946324601F040F8202000 -:103B3000A055A019421C0298416C3846FEF758F96E -:103B40003018201801994170012005B0F0BD000027 -:103B500070B598B004466D466021284604F0F2FE28 -:103B6000A16928461C30402205F0ACF85C20295C95 -:103B70000020002917D1227B082A14D8267D082E80 -:103B800011D86D46A81A1430A16804F0E1FEA81BF4 -:103B90001C302169324604F0DBFE044860222946CD -:103BA00004F0D6FE012018B070BDC04600180020F9 -:103BB00010B50C490860FEF7E5F9252040010A49D7 -:103BC00001240C5401F062F92102084804F0BAFE05 -:103BD000002003F03FFE204603F03CFEFCF7FEFA17 -:103BE00010BDC046201D00207C180020241D002090 -:103BF00080B506480078002801D104F089FC04490A -:103C000079440020024604F031F880BD241D0020D4 -:103C1000A457000080B582B001900648784401F0B6 -:103C2000FFFE293001A9012202F05AF8FFF7E0FF58 -:103C300002B080BDA061000001460020022903D827 -:103C400088000249794408587047C046BC560000B5 -:103C500080B5012805D0002807D10020FFF7DAFF42 -:103C600080BD0120FFF7D6FF80BD002003497944C5 -:103C7000034A7A4404F046FC80BDC04613000000AD -:103C80002700000001460020012903D888000249CE -:103C9000794408587047C0467C56000080B500281B -:103CA00002D0FFF7A5FF80BD0648784401F0B8FEBA -:103CB0002921435C002004497944044A7A4404F0F1 -:103CC00003FC80BD126100007DFFFFFF91FFFFFF3D -:103CD00080B5002003497944034A7A4404F012FC79 -:103CE00080BDC046ABFFFFFFBFFFFFFF80B5FF20D9 -:103CF00002F010F980BD80B50120FCF7FBFDFFF755 -:103D000077FF80BD80B50020FCF7F4FDFFF770FF62 -:103D100080BD80B50120FCF7EDFDFFF769FF80BD98 -:103D200080B50020FCF7E6FDFFF762FF80BD80B59F -:103D30000020FCF7DFFDFFF75BFF80BD80B50120B1 -:103D4000FCF7D8FDFFF754FF80BD80B50020014689 -:103D5000FDF746FCFFF74CFF80BD80B50120002138 -:103D6000FDF73EFCFFF744FF80BD80B50020FCF767 -:103D7000C1FDFFF73DFF80BD80B50120FCF7BAFD16 -:103D8000FFF736FF80BD80B50178490601D001F00C -:103D9000F3F880BDB0B5054607202840002401286F -:103DA00014D0022814D1002909D00B4802F0BEF823 -:103DB00068B200280ADA01F089FF002406E0FF213A -:103DC00052310548002202F0C9F804462046B0BD31 -:103DD000022000F021FFC046E81F0020F0B581B0AE -:103DE000E04D28780C2810DD0D286CD00E2800D16D -:103DF000C7E015280FD1DC48807901280BD1A879BC -:103E0000000708D4102000F007FF052800D111E1B9 -:103E10000C2800D181E2D54C00276760012020707A -:103E2000204602F047F8042002F0C0F860606928DC -:103E300000D05DE101F044F801F044F8BE25F84EF1 -:103E40007753042002F0B2F86060002800D164E2E9 -:103E5000972800D161E2C0243059002800D15CE2EB -:103E6000705BAA27C421715C80B2884200D354E2FF -:103E700002F068F8002800D04FE201F0E5FFB842F8 -:103E800004D102F00BF8B84200D046E23059715B21 -:103E900049014018CC217158002902D088470028D8 -:103EA0000AD0012803D13059715B490140180178CB -:103EB000490601D001F060F8705B401C7053315925 -:103EC0000029CFD129E2D54C00276760012020705E -:103ED000204601F0EFFF042002F068F8606000283F -:103EE00000D11AE2972800D117E2692800D099E1A1 -:103EF00000F0E6FF00F0E6FFBE25C94E7753042030 -:103F000002F054F86060002800D106E2972800D142 -:103F100003E2C0243059002800D1FEE1705BAA27DB -:103F2000C421715C80B2884200D3F6E102F00AF845 -:103F3000002800D0F1E101F087FFB84204D101F080 -:103F4000ADFFB84200D0E8E13059715B490140183B -:103F5000CC217158002902D0884700280AD00128B6 -:103F600003D13059715B490140180178490601D0ED -:103F700001F002F8705B401C705331590029CFD119 -:103F8000CBE1EA4D00276F6001202870284601F040 -:103F900091FF042002F00AF804466C60692C00D0FE -:103FA000E6E000F08DFF00F08DFFBE24E04E3753B9 -:103FB000042001F0FBFF6860002800D1ADE19728E4 -:103FC00000D1AAE1C0257059002800D1A5E1305BDD -:103FD000AA27C421715C80B2884200D39DE101F020 -:103FE000B1FF002800D098E101F02EFFB84204D1C3 -:103FF00001F054FFB84200D08FE17059315B4901A4 -:104000004018CC217158002902D0884700280AD0D6 -:10401000012803D17059315B4901401801784906E4 -:1040200001D000F0A9FF305B401C305371590029CA -:10403000CFD172E1BD4C002767600120207020467F -:1040400001F038FF042001F0B1FF6060002800D1CA -:1040500063E1972800D160E1692800D018E100F001 -:104060002FFF00F02FFFBE25B14E7753042001F043 -:104070009DFF6060002800D14FE1972800D14CE1FE -:10408000C0243059002800D147E1705BAA27C42121 -:10409000715C80B2884200D33FE101F053FF0028F9 -:1040A00000D03AE101F0D0FEB84204D101F0F6FEB2 -:1040B000B84200D031E13059715B49014018CC2140 -:1040C0007158002902D0884700280AD0012803D15E -:1040D0003059715B490140180178490601D000F060 -:1040E0004BFF705B401C705331590029CFD114E154 -:1040F000C0258F4C6059002800D106E1BE26A05B88 -:10410000AA27C421615C80B2884200D3FDE001F09F -:1041100019FF002800D0F8E001F096FEB84204D163 -:1041200001F0BCFEB84200D0EFE06059A15B49014C -:104130004018CC216158002902D0884700280AD0B5 -:10414000012803D16059A15B490140180178490653 -:1041500001D000F011FFA05B401CA0536159002961 -:10416000CFD1D2E0241E00203C210020501F00208F -:10417000D8206F4D2958002911D0642264290B469C -:1041800000D31346CA1A2A50D421002A07D16958ED -:10419000002904D0DC22AA582A5000208847002C8D -:1041A00000D1BAE0972C00D1B7E0C02428590028EC -:1041B0002FD0BE26A85BAA27C421695C80B28842A2 -:1041C00027D201F0BFFE002823D101F03DFEB84206 -:1041D00003D101F063FEB8421BD12859A95B490104 -:1041E0004018CC216958002902D0884700280AD0FD -:1041F000012803D12859A95B4901401801784906D3 -:1042000001D000F0B9FEA85B401CA8532959002931 -:10421000D2D1C420285CBE21695A7AE0501F002008 -:10422000241D0020C025424C605900286DD0BE26B8 -:10423000A05BAA27C421615C80B2884265D201F0EC -:1042400081FE002861D101F0FFFDB84203D101F0E9 -:1042500025FEB84259D16059A15B49014018CC21D3 -:104260006158002902D0884700280AD0012803D1CC -:104270006059A15B490140180178490601D000F05E -:104280007BFEA05B401CA05361590029D2D13CE0C9 -:10429000D020274C2058002803D0E978490800F0A6 -:1042A000AFFEC025605900282FD0BE26A05BAA27EC -:1042B000C421615C80B2884227D201F043FE00280D -:1042C00023D101F0C1FDB84203D101F0E7FDB842AE -:1042D0001BD16059A15B49014018CC2161580029CC -:1042E00002D0884700280AD0012803D16059A15B79 -:1042F000490140180178490601D000F03DFEA05B5D -:10430000401CA05361590029D2D1C420205CBE2199 -:10431000615A814201D301F015FE01F013FE00281D -:1043200001D100F081FC012001B0F0BD501F002040 -:10433000241D0020F0B5A5B01E4614460F460546C4 -:10434000FEF7BAF9002807D0A74979440A22204687 -:1043500004F0FEFA25B0F0BD0494A14800684024A2 -:10436000005D112844D128463946FEF704FA03902F -:104370009B480068005D11283AD128463946FEF76F -:10438000BDF9002812D07B208000039C002C07D0B0 -:104390009449085C002803D0083D2846FDF77EFEBE -:1043A000002C04987ED0924979447DE08C480068C6 -:1043B000005D11281CD128463946FEF7D7F90028A0 -:1043C00016D07B2080000399002907D08549085C1E -:1043D000002803D028460838FDF760FE2C78FD2C15 -:1043E0007F4F64D16878A97809020143C81C5FE057 -:1043F0002846FDF767FF002810D079480068406B19 -:104400000028A7D001F00CFB0146A8786A4610608E -:10441000EB1C0022049801F0CBFB9BE7704F38683F -:10442000C4882846FDF7C8FE0321002802D038685A -:1044300084880421200A04D005AA54701070022731 -:1044400002E005A80470012705A8C0196918142501 -:1044500003902A4600F0ABFBFF20EA306149085C7C -:10446000002810D05E480068C288012000219442D4 -:1044700000D008466946086014210398049A334620 -:10448000FFF7E2F966E7012069460C6048602F43B8 -:10449000B9B2B3B205A8049C2246FEF737FA002150 -:1044A000215457E75149794404F0A2FB52E7601CBC -:1044B0002918153920AE1422304604F049FA307814 -:1044C00000281CD0002020A94E4A7A440B781C09F1 -:1044D000145D05AD2C542C180F251D40535D6370E1 -:1044E000491C801C2928F1D3282005AB0021195430 -:1044F0004121454A7A44049801F0BEF82AE7032096 -:104500000121FD2C00D00846295C4018295C411887 -:10451000039800280CD0685C0818401C295C00290E -:104520000AD04C2909D1291849784018801C04E088 -:1045300068184078891C09E0401C291849784018FF -:10454000801C295C0818401C295C491C08182A5C3E -:10455000411C4C2A00D001466C186078A1780902F1 -:104560000143E078227912020243100408431F90AD -:104570001FA820497944042204F070FB00280DD0C4 -:104580001FA81E497944042204F068FB002800D0CB -:10459000E0E61B4979440B220498D9E63D68287966 -:1045A00019AE307021461131701C15273A4604F0BF -:1045B000CFF9A88801216A4603C205AD50233046D1 -:1045C00039462A46FEF7A2F9002129544420205CEE -:1045D000694608604121084A7A4404982B468BE7D3 -:1045E000201D00207C1800206A530000BC4D0000F4 -:1045F000A94E0000F84C0000994C0000084D000046 -:104600002C510000C74D0000AE4D0000F0B597B032 -:1046100001AD50242846214604F094F94548464F00 -:10462000391815A80822FEF7B0F9444838187B213C -:1046300089002A462346FFF77DFE414E4022304640 -:10464000294604F03FFBA3208000385C142811D1D8 -:104650003C48381840497944042200F0C7FA002841 -:1046600008D1394838183D497944042200F0BEFA8F -:1046700000282FD0354C374626682736304604F0C0 -:10468000BFFA02463D4641352846314600F08FFAD2 -:1046900026682736304604F0B3FA202129543046E4 -:1046A0003E4604F0ADFA2818401C83218900224AB6 -:1046B000505015A8FDF756FC05462068273004F039 -:1046C0009FFA2818401C3018412100224254012032 -:1046D00017B0F0BD1E48381801210022FDF702FF77 -:1046E0000346304641301F2B06D0032B07D0012B49 -:1046F0000BD11B49794404E01A49794401E01A4975 -:104700007944062204F024F904E01421174A7A447B -:1047100000F0B2FF35464135284604F071FAC4B2C4 -:1047200028198321890078500A483818FDF71AFCA7 -:104730002018C8E7820200007C1800208A020000CE -:10474000001800208D02000091020000201D0020B2 -:1047500095020000990200005D4C000063500000CB -:10476000C44B0000C44B0000C44B0000BC4B000015 -:1047700070B58CB020206946486004AE0E600C48CD -:1047800094300C4D2A46413201240023214601F089 -:10479000C3FA6846082306601836436086604121E4 -:1047A000054A7A44284600F067FF20460CB070BDE9 -:1047B0007C18002000180020374B000010B5252081 -:1047C00040010D4C215C0020002900D010BDFFF7F6 -:1047D0001DFF8F20C000205808496158491C0B1A42 -:1047E000074855301421074A7A4400F045FFFCF78A -:1047F0007BFC012010BDC0467C1800207C0400001A -:1048000000180020FD4A0000B0B582B0252040010C -:10481000164D285CA97F01430024002902D02046C0 -:1048200002B0B0BD12482A18294615316846FEF775 -:1048300040FA0028F3D00F48285C01240328EED169 -:1048400000206877F52040003D21C900695C0029FF -:1048500007D0295C002904D101242C54002028759C -:10486000DDE70A2028750124D9E7C0467C1800201E -:10487000850400008404000080B5FFF779FF012063 -:10488000FDF7F8F980BD000010B5044604497A220E -:10489000FEF762F900212046FEF7C8F810BDC046B9 -:1048A0000018002010B5074CC834204604F0A8F9C1 -:1048B000202121542018002141700120FCF71AF812 -:1048C00010BDC046E81F002080B503497944002090 -:1048D000024603F0CBF980BD544B000080B503497C -:1048E00079440020024603F0C1F980BDB04B0000BE -:1048F00080B505497A22FEF72FF904497944002052 -:10490000024603F0B3F980BD00180020384C0000C7 -:1049100080B505497A22FEF71FF904497944002041 -:10492000024603F0A3F980BD00180020C44C00002B -:1049300080B5034979440020024603F097F980BD11 -:10494000684D000010B58CB06C46204604F036F976 -:10495000A0850D49084206D1684601F01BFB0A906C -:10496000FF2001F0D7FA01F009FB6946884202D125 -:104970000A9801F00FFB6846808D002801D10CB029 -:1049800010BD00F049F9C046FFFF0000F0B59FB030 -:104990000446002C2FD10DAC00264822204631467B -:1049A00000F01BF9032525720D9633480E90204622 -:1049B0000930344979440526324603F0C9FF2046C0 -:1049C0001730314F7F443946324603F0C1FF20464D -:1049D00027303946324603F0BBFF26462D362B4999 -:1049E000794430462A4603F0B3FF40201121215478 -:1049F0001A9604201E9021480460214C01200102D7 -:104A0000204603F09FFF01AD284604F0D7F8A885A3 -:104A100085B2002D0BD001A8002181850B9801F0F3 -:104A2000B9FA0B9801F0B6FA102DE7D01FE001ADEE -:104A3000284601F0AFFA0B9000F028FAFDF7A2FA31 -:104A4000002002F007FF012002F004FFFFF7D0F87A -:104A5000FBF7C4FB01F092FAA84202D10B9801F0D7 -:104A600099FA01A8808D0028C8D000F0D5F8FFF78A -:104A700069FF1FB0F0BDC04678006E00201D002009 -:104A8000241D00203C490000314900001A49000063 -:104A9000F0B59FB00446A068002831D10DAD0027C5 -:104AA00048222846394600F098F8032000902872E2 -:104AB0000D9737480E902846093037497944052725 -:104AC0003A4603F045FF28461730344E7E443146BF -:104AD0003A4603F03DFF2846273031463A4603F078 -:104AE00037FF2E462D362E4979443046009A03F082 -:104AF0002FFF4020112129541A9604201E90A560F2 -:104B00000027244E01AD284604F058F8A88530420D -:104B100007D101A801F03EFA0B90F8070FD001F081 -:104B2000D5F901F02BFA01A9884202D10B9801F0C6 -:104B300031FA01A8808D002828D10127E2E70A2058 -:104B400001F0B8F86068022817D004280BD00328B9 -:104B5000E5D1E06800218161A168E068FEF78CFF83 -:104B6000E1688861DBE7E0680021C162A168E06874 -:104B7000FEF7B8FFE168C862D1E7E068FEF7E8FF3A -:104B80000028CCD0A068FFF713F8C8E700F044F87D -:104B900078006E00FFFF0000344800002948000044 -:104BA0001248000080B5002001F0F4F980BDB0B5D6 -:104BB000884208D9002A0FD0491E401E8B5C8354BE -:104BC000521EFBD108E0002A06D000239CB20D5DE6 -:104BD00005555B1C521EF9D1B0BD80B50B46002AAD -:104BE00003D011461A4603F0BBFE80BDB0B50023CA -:104BF000002A0FD0401E491E8C5C855C521EA542C7 -:104C000002D1002AF8D105E00020C0430123A542CB -:104C100000D80346D8B2B0BD10B5044601F0AEF9D5 -:104C2000214603F0D7FF000080B501F08BF9002882 -:104C300000D080BD0648002141706022027002222F -:104C40008270C1700171052101F070F980BDC0460C -:104C5000241E0020B0B51A48C078032807DC0128BC -:104C60000DD0022828D1174802F073F9B0BD0428EE -:104C70001FD0082820D1134802F069F9B0BD114CAB -:104C80000121204602F05EF9204602F03DF90E4C6B -:104C9000A079002811D120460C3000250422294695 -:104CA000FFF79BFF1034082220462946FFF795FFA7 -:104CB000B0BD044802F049F9B0BD1020FFF7ACFFC9 -:104CC000241E0020FC2100203C2100207F210140E7 -:104CD0000020032903D8C8B201490818007B704797 -:104CE0003C21002080B516480179042918D00229FA -:104CF00006D0012922D1811D134802F00DF880BD94 -:104D0000C2787F211140032918D8C9B24A000D4B3F -:104D10009A1800231382821D0B4802F082F880BD8E -:104D2000C2787F211140032908D8C9B2054A521818 -:104D300043791373821D044802F01CF880BDC046FD -:104D4000241E00203C210020FC21002070B51546C7 -:104D50000E460446FF2D1BD80E485021017020211D -:104D600001714571E91C817080222243C270090AD9 -:104D70004170062101F0DAF83046294601F0D6F8F4 -:104D80007F2020404000044908187D21090101824C -:104D900070BDC046241E00203C21002080B50A467C -:104DA000014682201423FFF7D1FF80BD80B50A465B -:104DB000014683201423FFF7C9FF80BD80B50C484E -:104DC0000178002900D080BD062181710A2101707F -:104DD00008498B784A7812021A43FF232A339A42F1 -:104DE00000D31A464280C91C0348FFF7E0FE80BD8D -:104DF0003C210020241E0020E81F0020B0B52048E0 -:104E0000827841780902114300780F280ADC0E28C5 -:104E100010D00F2823D10020012927D1FFF71AFF36 -:104E20000120B0BD10281ED0162818D1FFF7C6FFEC -:104E30000120B0BD13488168643181601621124A97 -:104E4000435A002B08D06424642B1D4600D325460A -:104E50005B1B435213420ED0891E0E29F0D1022053 -:104E6000FEF7BCFFB0BD0020032900D2B0BDFFF7A4 -:104E700039FF0120B0BD002101701020FFF7CCFEEA -:104E8000241E00203C210020FFFF0000B0B50A20B6 -:104E900000F010FF084C0025182220462946FFF795 -:104EA0009CFE65802570A571A56000F061FB03483C -:104EB00005604560B0BDC0463C2100205421002063 -:104EC0007047000002480021016041607047C04601 -:104ED00054210020F0B589B00546084600F0A0FD39 -:104EE0000446002C43D02069002840D0284600F01A -:104EF00097FD014602AD1C2228460192FFF757FE9E -:104F00002168E98062682A81A0681A4F65233B7096 -:104F100089B292B24A434243D1084E1C07231A4237 -:104F200000D10E46314600910426864070181D308F -:104F3000B870000A78700321384600F0F7FF284661 -:104F4000019900F0F3FFA06838700121384600F0A5 -:104F5000EDFFE06800F064FDB1B200F0E7FF0098FB -:104F600085B2206900F05CFD294600F0DFFF09B042 -:104F7000F0BDC046241E002070B500F051FD04466F -:104F800020787F26064000F0DDFF002830D1002E7B -:104F90002ED0E06900281DD000F042FD0546052E08 -:104FA00002D1A07E002824D0284603F029FE064620 -:104FB00012486521017031461C318170090A417027 -:104FC000032100F0B3FF1C21204600F0AFFFB1B277 -:104FD00028460BE0094800214170652101701C251D -:104FE0008570032100F0A2FF2046294600F09EFFB5 -:104FF00070BD20462946FFF76DFF70BD241E0020BE -:1050000070B50446002C28D01448066845688E42C6 -:1050100001D16D1C45600E43002902D00660324666 -:1050200005E00022026042600D4B5B1C1E438A4279 -:1050300001D000214160082D0CD30321284603F044 -:1050400091FB012290073043002900D03046D10760 -:10505000884300E030462946A04770BD5421002017 -:10506000FFFFFF7FF0B581B00F4E01243470B11CFB -:10507000FF2750377A1C204600F03EFF054675702A -:105080007A1B7719F91C022000F036FFB8702D1832 -:105090007619F47000F024FF3071902070710020B8 -:1050A000B071E81D01B0F0BDE81F0020F0B58BB075 -:1050B0000A46064607210E4207D03346D8B291B2BF -:1050C000FEF768FE80B20BB0F0BD4B208400832059 -:1050D0000390AA4DA84F3346019109E06920A949E0 -:1050E00008700398801C487002220199079B2DE1EB -:1050F000102130460840049292B20592002A06968A -:1051000000D1B5E0002800D0B2E0079300910290F2 -:1051100007E0A1B20022384600F020FF012000F095 -:105120003FF900F00FFF0028F3D17D200001A968AE -:105130000E1828780928079A42DC072848D0092841 -:1051400063D100218E48079101F0F8FB10E0FFF7D2 -:105150006BFDA1B20022384600F000FFA868B04203 -:1051600000D3FEE0FFF74AFE00F0ECFE0028F0D18D -:10517000834801F039F90028E9D0059AD01D40088C -:10518000A92800D3F3E003980D307E4B985498186B -:1051900007994170581D0499891C8AB205921946D5 -:1051A000FFF705FD052277480799FFF716FD0598DB -:1051B000401D83B272480399724A01F0D3FB3FE06D -:1051C0000A2804990AD00B2822D17148784401E0BA -:1051D0006E487844059900F035FA31E020462530D4 -:1051E00080B2059E864200D9C1E053203870B97064 -:1051F000080A78700321384600F098FE614831466D -:1052000000F094FE002028701DE0002800D1ABE0E3 -:10521000D0B20599FEF7BEFD002811D0A4E0FFF73B -:1052200003FDA1B20022384600F098FEA868B04203 -:1052300000D396E0FFF7E2FD00F084FE0028F0D1F5 -:1052400028780028EBD10020A87128706880069E7D -:10525000B10600D536E7FFF7E7FC30060298009963 -:1052600006D5089108AA484B1846114601DF029856 -:10527000002804D170066ED40020A8712870002088 -:10528000688000F05FFE002801D1FFF7CDFCA1B2DD -:1052900000223846079200F061FE022806D8B9784D -:1052A0007A7812020A43D11C81423DD1FFF7A6FD54 -:1052B000688829780029E4D00028E2D0354979446B -:1052C0000422304E3046FFF791FC00282ED03249A0 -:1052D000794404223046FFF789FC00282BD02F495F -:1052E000794404223046FFF781FC002837D1039827 -:1052F0002730C6B200F0D2FDB04200D0EEE6012069 -:10530000204E3070B01C402100F0BAFD7070811C3E -:10531000184A121D1140039B0D337354C11C1140D8 -:1053200000237354021D10E00020A7E7FFF79AFE48 -:105330000246002309E00020707003980D303070A1 -:1053400080200699014302220B460199DEB20B42EE -:1053500000D1CDE6B2E6688806494018B2E6688812 -:10536000B0E61020FFF758FC0920FFF755FC02209B -:10537000FFF752FCFBFF0000241E00203C21002010 -:105380005C210020E81F0020BE9A0060C7FBFFFFE1 -:10539000DDFBFFFF1244000005440000FA4300005B -:1053A00070B5044600F0CEFD002801D1FFF73CFCAB -:1053B0004B2081000B4E002530462A4600F0CEFDE2 -:1053C0003078152806D8012181400748014201D0D4 -:1053D000002C05D1FFF712FD0125002800D105465C -:1053E000284670BD241E00202070200010B5FFF755 -:1053F0001BFC084C4B2081000022204600F0AEFD33 -:1054000020780E2801D0FFF7F9FC00F09BFD002862 -:10541000F0D110BD241E0020F0B581B000920F46DF -:1054200004464B4EB74210D0494D00214026284635 -:105430003246FFF7D2FB00984028024600D332469E -:1054400028463946FFF7B3FB414EB07801280ADC05 -:10545000002828D0012869D1F01C042100F04EFC5E -:10546000402130462BE0022827D005285ED1307934 -:10547000F17809020143374C2068002781425BD153 -:10548000206800281ED03448009D2918334A13682C -:105490006D1FADB2AB4200D21168051D0D40304802 -:1054A0000068711D34E0F01C002704223946FFF724 -:1054B00094FB40213046A0473EE025484021A047CC -:1054C000002739E0B079717909020143254801606C -:1054D00001684908A8292FD801682048016071781F -:1054E000327812020A4320490A601D491F4A0A60A5 -:1054F000009D691F8AB218495218D21C0368ED1F1B -:10550000ADB2AB4200D202680D1D1540F11D174827 -:105510002A46FFF74CFB11480168491B01601048FF -:105520000168491901602068401C20600B4801682F -:1055300001200227002907D1064800210160084800 -:105540000160064801603846C0B201B0F0BDC046F7 -:10555000A0210020E0210020FBFF0000E821002026 -:10556000EC210020E4210020F0210020E81F002091 -:10557000034800210160034801600348016070474F -:10558000E0210020EC210020E8210020F0B581B0CE -:10559000264F3A68264C2168002921D0002A1FD0C6 -:1055A0000090264D002140222846FFF716FB0520DB -:1055B000A87023480168090A2970006868701D49AD -:1055C0000868000AE87008682871096820680029DE -:1055D0000ED03B263B2800D826683968681D12E0AB -:1055E00014480021016039601348017021601BE0FC -:1055F0003926392800D826682068000A6871206892 -:10560000A8713968E81D3246FFF7D1FA009A0949B6 -:105610002068801B20603868801938600868401C4A -:10562000086006484021904701B0F0BDEC21002001 -:10563000E8210020E02100203C210020A0210020C2 -:10564000F021002080B500290BD0064A002313600A -:10565000054A1160054A064B1360064A1160FFF7C0 -:1056600095FF80BDE0210020E8210020EC210020F2 -:10567000E81F0020E421002081B0F0B58EB015466F -:105680000C4606901393022C00D2BAE1069800282B -:1056900000D1B6E1002D00D1B3E10698214603F018 -:1056A00051F913A809902978002900D1A9E1671EB2 -:1056B000002602E0A8194178761CC8B2002801D063 -:1056C0002528F7D1BE4200D33E46069C20462946F7 -:1056D000324603F041F9BF1BA4190694002F00D1F4 -:1056E0008FE1A95DAD19252900D087E16B1C002051 -:1056F00020210A220892049005900790044608464B -:1057000004E009990A1D0992096804911D46224680 -:1057100029786D1C00242D29F9D0472918DC2F2960 -:1057200026DD0B46303B0A2B00D366E130290446C8 -:1057300000D10C46079B002B00D004460A23079893 -:1057400043435818303807902B4620461446DDE76F -:10575000672904DD722921DD73293AD122E062290B -:105760003CDC48294BD1014601200590084617E052 -:10577000252958D02A2926D02E2900D03DE1297884 -:105780002A2900D03AE16A786B1C01242A21482A90 -:10579000B7D0682AB5D0732AB3D02FE1682936D1A3 -:1057A0001021089109990B1D0993032313400968DF -:1057B000012B00D1BBE0022B00D1BAE0032B2B461A -:1057C0001446A3D0C6E02978022473292B4698D02A -:1057D00014E1752929D078291CD00EE1632900D164 -:1057E0009BE0642900D008E1029003970998011D0D -:1057F00009910068C11742184A40C00F1CE058299F -:1058000000D0FAE0014601200590084602E0702928 -:1058100000D0F2E0029003970998011D09910268F7 -:105820000020102709E025207BE0029003970998CB -:10583000011D0991026800200A270124974208925D -:10584000049012D8012638460446394602F004FF77 -:10585000B04209D1384660430799491E079108991B -:1058600088422646F0D900E034460798411E049B42 -:10587000002B00D107990026F243002B029800D19B -:105880001A460192C2B2302A06D1002B04D00AA8CF -:105890002D23037000230126881E0D280BD80AA88B -:1058A0003043491E049303F05BF8049B079880196A -:1058B00001994018461E002B03D00AA82D218155BE -:1058C000761C0598002C1AD0002802D05348784442 -:1058D00001E05148784407900898214602F0BCFE48 -:1058E000394602F03FFF0798405C0AA988552046D8 -:1058F000394602F0B1FE761CA7420446ECD9039F5C -:10590000BE4200D33E460AA9069C2046324603F01A -:1059100023F8BF1BA41906946DE00998011D099195 -:105920000068069908707F1E491C069163E0049E7A -:1059300016E00878002860D10499B94200D33946AE -:105940002022069C2046049103F00AF804983F1A8E -:1059500024183DE000228B5C521C002BFBD1561E0C -:10596000089810282AD1002E47D000243B46085D15 -:105970000F2202400009022B1F4642D3059B002B39 -:1059800005D0012B0ED10794224B7B4402E00794F3 -:105990001F4B7B44D2B29A5C069C6270C0B2185C0A -:1059A0002070079C3846871E02282AD0641C06985F -:1059B000801C0690B4423B46D9D30DE0BE4200D3D2 -:1059C0003E46069C2046324602F0C6FFBF1BA41985 -:1059D0000694002F079C14D0B4420ED9A41BBC42DD -:1059E00000D33C462022069E3046214602F0B8FFF6 -:1059F0003F1B36190696002F03D02978002900D0C6 -:105A000056E600200EB0F0BC02BC01B00847C0460C -:105A10004D3D0000653D00000B3E0000213E0000B2 -:105A200080B50449884204D30349884201D200F07A -:105A300005F880BD0000D0C0009ED0C07A46024963 -:105A4000C91C891A401A70473D5AD0C010B541018F -:105A5000104A0A40430E01210B405B420E4C1C4091 -:105A60005440820E0A4052420C4B13406340C20E17 -:105A70000A4052420A4C14405C40020F0A40524213 -:105A8000084B13406340400F08404142064808401D -:105A9000584010BDE0FFFF3FB2576A3B6D8E502665 -:105AA000FA19A11EDD33423DB362142AF0B587B066 -:105AB00005930492064602910D7800270120002DDF -:105AC00003971BD00298401C0690012000272C460B -:105AD000019721464139E2B2202A5FD3C9B21A297F -:105AE0005CD3FFF7B3FF01460698C25DE020044097 -:105AF000600948407F1C002A1446EAD10599C9195B -:105B0000C91D5A2903994CD8FFF7A0FF002D0ED0CC -:105B100002994C1CFFF79AFF014635701F20284060 -:105B20004840611C761C2578002D0C46F2D13121AD -:105B30003170711C06910599002914D000241A4E69 -:105B40007E44039404990F5D1F2F29D8F55DFFF75C -:105B50007DFF06990D557840641C05998C42F1D360 -:105B60000699091906910624FFF770FF641EFBD100 -:105B70000121484019220D497944069B0446D4402E -:105B80001F2525404C5D1C70541F5B1C002A2246BB -:105B9000F4D1002006998871012102E0019900E00A -:105BA0000399084607B0F0BD28330000F03200002A -:105BB000F0B595B00C46054600200390102A1EDC77 -:105BC0001A99002A03D08E1E262E04D917E0142914 -:105BD00001D0202913D104AE327001206A46082773 -:105BE00082C21060701C03A9052200F00AF8039815 -:105BF000431C0393284621463246FFF757FF15B052 -:105C0000F0BDF0B587B0049301910546104601231D -:105C100083405C1E00270E9900910D9902910C9A09 -:105C2000002A3E4627D04142059100263746029978 -:105C300076188F4004990B781F43491C0491521E1B -:105C400003928642069712DB01990B6802462046B2 -:105C50005C1C0C60059CA4192F46069DE54004467B -:105C600010462540FD543D46361A8642EDDA039A29 -:105C7000002A069FDBD1009900290CD0002E13D0FA -:105C800001990B68024620465C1C0C60911B8F40FA -:105C90000740EF5408E0811B8F4027400021029805 -:105CA000864202DA002F00D10121084607B0F0BD7C -:105CB00001DF704780B584B00190034801A9FFF768 -:105CC000F7FF04B080BDC0463701006080B582B0E8 -:105CD00002486946FFF7ECFF02B080BD3C0200605D -:105CE00080B586B0019002910392034801A9FFF7A5 -:105CF000DFFF06B080BDC0467F03006080B584B082 -:105D00000090019103486946FFF7D2FF019804B063 -:105D100080BDC0462C05006080B588B00090019120 -:105D2000029203930A9804900B98059003486946E1 -:105D3000FFF7BEFF019808B080BDC0463B0700607A -:105D400080B584B00190034801A9FFF7B1FF029824 -:105D500004B080BD7F08006080B584B00190034826 -:105D600001A9FFF7A5FF029804B080BDDB0A00601F -:105D700080B586B000900191029203930348694672 -:105D8000FFF796FF019806B080BDC0462C0B00605F -:105D900080B588B000900191029203930A98049014 -:105DA0000B98059003486946FFF782FF019808B0F9 -:105DB00080BDC0462B1A006080B586B0009001916E -:105DC0000292039303486946FFF772FF019806B0F9 -:105DD00080BDC046EA2E006080B586B0009001917B -:105DE0000292039303486946FFF762FF019806B0E9 -:105DF00080BDC0462E2F006080B58AB00090019112 -:105E0000029203930C9804900D9805900E980690BA -:105E10000F98079003486946FFF74AFF01980AB0B8 -:105E200080BDC046F338006080B586B00190029115 -:105E30000392044801A9FFF73BFF029880B206B025 -:105E400080BDC0466E92006080B582B0034869464E -:105E5000FFF72EFF0198C0B202B080BD4F9F0060D7 -:105E600080B588B001900291039204930A9805903E -:105E7000024801A9FFF71CFF08B080BDBA530060BB -:105E800080B584B00090019103486946FFF710FF88 -:105E9000019804B080BDC046FCA8006080B582B007 -:105EA00003486946FFF704FF0198C0B202B080BD05 -:105EB0003CA0006080B584B00190034801A9FFF7C1 -:105EC000F7FE029804B080BD5864006080B582B0CF -:105ED00002486946FFF7ECFE02B080BD8D680060A5 -:105EE00080B582B003486946FFF7E2FE019802B030 -:105EF00080BDC0466E6A006080B586B00190029198 -:105F00000392034801A9FFF7D3FE029806B080BDB3 -:105F1000D474006080B584B00190034801A9FFF7F4 -:105F2000C7FE04B080BDC046BE9A006080B584B094 -:105F30000090019102486946FFF7BAFE04B080BDA7 -:105F40008183006080B582B003486946FFF7B0FEE8 -:105F5000019802B080BDC046BB84006080B586B0A9 -:105F6000019002910392044801A9FFF7A1FE029853 -:105F700080B206B080BDC046E485006080B582B0C6 -:105F800003486946FFF794FE019802B080BDC04601 -:105F9000B187006080B584B00190034801A9FFF784 -:105FA00087FE029804B080BD7588006080B584B01B -:105FB0000190044801A9FFF77BFE0298C0B204B02B -:105FC00080BDC0468B9C0060F0B585B03A4A12781F -:105FD000002A03D083213A4A7A440BE00A9A452AE0 -:105FE00003D88321374A7A4404E0072907D1832163 -:105FF000354A7A44022300F0B5FC05B0F0BD0192A9 -:10600000029040200393185C0490002822D004984A -:106010000528039D08D1284641302C4979440522A2 -:10602000FEF7E4FD002833D041350027284E7E449A -:10603000049C0321384602F00FFB0221C94341436F -:10604000705C297841402970641E761C6D1C7F1C91 -:10605000002CEED145200399085C4630019A90420D -:1060600010D141311548049C2246FEF7A0FD0720BF -:10607000114988714C80092008700121029800F0B4 -:106080005DFCBAE78321134A7A4402230298B2E7FF -:106090000A4D03222A70681C0F497944FEF787FDD8 -:1060A000281D0E4979440422FEF781FD2878431DFE -:1060B000832102982A469EE73C210020E81F002009 -:1060C000293700001D37000013370000EB360000B1 -:1060D000DF3600008E360000733600006D3600009B -:1060E000F0B581B01D460E460446284600F016FC69 -:1060F00000280ED02068C11C090A6A469170811CD4 -:10610000090C5170411C090E1170001D2060D070E7 -:1061100004E0684604222946FEF749FD174F08228D -:1061200038463146FEF743FD3846083069460422BA -:10613000FEF73DFD00207873022139730121B97308 -:10614000F8733874284600F0E9FB0146201D8625C7 -:10615000002906D029467931C9B20422FEF73DFD57 -:1061600003E069460422FEF722FD044A112320467B -:10617000294600F0F7FB01B0F0BDC046E81F002043 -:10618000F0B583B0029088794B791F020743887875 -:1061900001904B780E781546093DACB2A74204D069 -:1061A000D01FD21F92B297421BD13D46002E08D07D -:1061B00083211C4A7A440223029800F0D3FB03B0E7 -:1061C000F0BD022B18DC012B23D0022B1DD1A8B26D -:1061D0006A461060CB1D002202980199FFF7F4FE79 -:1061E000EDE7E4B2A742E1D0D2B297420546DDD056 -:1061F00083210D4A7A44DEE7032B0ED0C12B04D154 -:1062000083210A4A7A440423D6E783210A4A7A443E -:10621000D1E78321064A7A44CDE78321054A7A44AF -:106220000823C9E7703500000F3500001C35000059 -:10623000E9340000FA3400001835000080B5C16967 -:106240008A784B781B0213430A78812A09D0832A63 -:106250000CD0862A0ED1C91C031D0022FFF740FF77 -:1062600080BDCA1C812100F07DFB80BDC91C1A467F -:10627000FFF786FF80BD000070B50D460146012A7C -:1062800011D1094C20462A46FEF791FC60194026A0 -:10629000721B00252946FEF7A0FC812021463246CC -:1062A0002B46FEF753FD70BDA02100200282C16085 -:1062B0000022C282827642858284C1610262704776 -:1062C000F0B583B00D4604462A20215C20462A30D2 -:1062D00001294AD000293BD12B21002262542346B8 -:1062E0002B332027E15DC91EC9B22646203601297D -:1062F0003ED8218BE28A91423CD94020012D00D02A -:1063000038460290A07E03230126002800D03346A1 -:106310000027012D3E4600D12E46B60033431E46CF -:10632000029B9B1B891A1A46914200DC0A4691196E -:106330000291012D08D1211D2A48042701923A46D5 -:10634000FEF735FC019AA07E002820D0FF302BE01C -:106350002521615C062908D12B21625C002363544E -:1063600023462B33002A03D1BBE72B2000212154E5 -:1063700003B0F0BDFCD10021A176E182197001705B -:10638000B1803160E068E06115480170F0E74020BD -:10639000205CB9B2134B58540120384381B2637E5C -:1063A000104F7B54471C207EB9B20E4B5854E16904 -:1063B000002907D01746BAB29819E38AC918FEF720 -:1063C000F6FB3A46E08A1018E082A07E401CA076D8 -:1063D000029881B203482A46FFF74EFFC8E7C0463D -:1063E0003C210020A021002001462A200A5C012037 -:1063F000002A10D0012A01D100200CE025200A5CDF -:106400000020062A07D12B200A5C01200021002A47 -:1064100001D0084670477047B0B52B210124445481 -:10642000011D0B4D04222846FEF7C1FB00206871B8 -:10643000832028710220A8716920E8717C20C04364 -:10644000801C2872092128462246FFF715FFB0BD9F -:10645000A0210020B0B52B2101244454011D084D7A -:1064600004222846FEF7A3FB0020687188212971C9 -:10647000A871072128462246FFF7FEFEB0BDC046A0 -:10648000A0210020F0B581B004462520205C2646DE -:106490002536002505286AD008784B781B0203436F -:1064A0008878CD782D02054328041843237965792F -:1064B0002D021D43A379E7793F021F433B042B4381 -:1064C000834257D108790B1D658C002D13D02423EE -:1064D000E75C23462433B8424CD1278B401C18700C -:1064E0007B1B501F984200DB18464219628482B21F -:1064F000208D491D23E07C25ED436D1DEFB28325E2 -:10650000B84204D12046FFF7A5FF01252FE08F797F -:10651000497909023943C91CA8422BD1208B8DB27D -:10652000A84227D189B2164D24270020E055121F1A -:106530008A4200DB0A466284154019462A46FFF764 -:1065400073FC2085218B628C01258A420FD3E18C5C -:1065500088420FD106203070002060842A20205C01 -:10656000012804D12046FFF757FF0020307028464D -:1065700001B0F0BD052030701020FEF74DFBC04685 -:10658000FFFF0000F0B589B0044623722020205C94 -:106590002646203603280AD02A25675D25462A3557 -:1065A000002F1BD02046FFF76DFF002814D1D748DD -:1065B00006210172042131707A21C9433A31402207 -:1065C000A1540830E0610020A076E0820120208301 -:1065D000217A2046FFF774FE09B0F0BD042809D1E6 -:1065E0002B2000272754A776E7822F70B7803760CB -:1065F000E068E06108910020012B00D11846870077 -:10660000012039460143079191423BD80390012B69 -:1066100006930492059707D1201D04220899FEF7DE -:10662000C6FA059F049A069BE08A00280CD0012B2D -:1066300024D120461230211D0422FEF7D7FA059FEF -:10664000049A069B002819D003213846084390423B -:1066500018D800910899C8190290C8570F467A2196 -:10666000C9437A3149B28525884225DDA7480421EE -:10667000017231703A3540216554A2E70220384357 -:10668000904202D9A148852193E72120205C9842BD -:1066900046D13078012851D1012B7FD1211D042210 -:1066A00008980392FEF7A2FA059F002876D0974833 -:1066B0000621017203997EE70195012B14D13078F0 -:1066C00001281ED1251D2146123104222846FEF73D -:1066D0008DFA069B002807D0029800780199491C82 -:1066E000C9B2884200D0E8E03078012809D1012BF6 -:1066F00000D080E0029800780199491CC9B2884214 -:1067000079D1079978184078795C0F020743208A7D -:10671000C01E87421FDD7D480099017204216DE093 -:106720007A20C04301460831784A11720421317041 -:106730003A30402160540832E26144E7012B56D1DF -:106740002B2000212154A176E1822970B180316093 -:10675000E068E06140E702980078812805D086284B -:10676000019D51D0832800D097E0012B57D1251DE2 -:1067700067497944042228460892FEF737FA002830 -:1067800007D06449794404222846FEF72FFA0028EE -:1067900045D15E480B21017208992FE0089AD11962 -:1067A000D05DA27E904222D10498079A851AE08A91 -:1067B000228B121A954200DB1546AFB2E26910181F -:1067C000491C3A46FEF7F3F90699012908D1E08AF7 -:1067D000E1690918E08C3A46FFF726FB0699E08448 -:1067E000E08A2818E082A07E401CA0763CE0474862 -:1067F00004210172DFE64548042101723170019ADB -:106800003A3240216254DCE6012B6AD1201D424914 -:10681000794404252A46FEF7E9F9002870D0049847 -:106820000599451AFF1CBD4200DB3D46AAB2E0694E -:1068300002990892FEF7BBF9069B012B06D1E1698C -:106840000020089AFFF7F0FA069BE08421202354E9 -:106850002783E5820020A07620461230211D0422E5 -:106860001D46FEF7A4F92946E08A012901D1218BB2 -:1068700006E0218BCA1C824202D22448032198E6FA -:10688000884204D20020606301203070A4E6022018 -:1068900030702046FFF7D2FC9EE61C48039B037233 -:1068A00004213170019A3A32402162540830E0618B -:1068B0000020A076E08223838AE6144C042220463E -:1068C0002946FEF774F90020607101983A30207172 -:1068D000039AA2710620E07108212046FFF7CCFC44 -:1068E0007AE60A48039A0272042131703A3540214F -:1068F00065540830E0610020A076E082228367E6DC -:1069000002480B210172357079E7C046A0210020B2 -:10691000B62F0000A82F00001C2F000080B50649EC -:1069200079440422FEF762F9014601200022002981 -:1069300000D0104680BDC046082E000080B52A2237 -:10694000835C02462A32002906D0002B08D101219F -:106950001170FFF761FD80BD012B01D10220107085 -:1069600080BD000070B504462A20205C002809D0B4 -:10697000012824D02520205C062820D12B20205C53 -:1069800000281CD12020032525544020215400201C -:10699000A076E261E08223832120215C2546213517 -:1069A00003290DD1084E3078002808D0032100E0DB -:1069B00029782046FFF784FC30780028F8D170BD94 -:1069C0002046FFF77DFC70BD3C21002002490020DD -:1069D0000860024908607047F8210020F421002077 -:1069E00010B50748002444704F21017001218170C7 -:1069F0000221C1700421FFF799FA204610BDC0465C -:106A0000241E002070B582B06D4600246C704F26A5 -:106A10002E700220A8700320E8702C7105212846F2 -:106A2000FFF784FA6C702E700120A870E8700421C2 -:106A30002846FFF77BFA204602B070BD10B582B041 -:106A400001A8002444704F210170012181700221AE -:106A5000C1700421FFF76AFA204602B010BD0000A1 -:106A6000B0B582B0144800240460144804606D4638 -:106A70004F2028706C700520A8700420E870012059 -:106A800028716971AC71012A05DC002A0AD0012A3B -:106A90000AD1042006E0022A03D0032A04D10220EE -:106AA00000E00320694688716846C3710821FFF73A -:106AB0003DFA002002B0B0BDF8210020F4210020F2 -:106AC00010B582B06846002444704F22027005223F -:106AD00082700422C2700122027141718471C471FA -:106AE0000821FFF723FA204602B010BDB0B582B0EE -:106AF0000D466846002444705021017003218170C6 -:106B0000C5704021017144710621FFF70FFA802002 -:106B1000054201D0074800E0054801687F22154082 -:106B20000122AA400A430260204602B0B0BDC0461E -:106B3000F8210020F421002070B582B00D4668468F -:106B4000002444705021017003218170C57080269B -:106B5000067144710621FFF7E9F9354201D0074873 -:106B600000E0054801687F2215400122AA409143B8 -:106B70000160204602B070BDF8210020F421002001 -:106B80008020014201D0064800E0044802787F20BE -:106B900001400120884010407047C046F821002085 -:106BA000F421002010B582B06846002444704F22C2 -:106BB0000270022282700322C27001710521FFF768 -:106BC000B5F9204602B010BDB0B582B01C461546DE -:106BD000684650220270C170202101714471E11C8D -:106BE0008170090A41700621FFF7A0F92846214665 -:106BF000FFF79CF9002002B0B0BD10B582B0684626 -:106C0000002444705023037003238370C17030212B -:106C1000017142710621FFF789F9204602B010BDCB -:106C200070B515460E4604460220002C0FD0D42124 -:106C3000204601F087FE002E01D0B02026509C2077 -:106C40000121215425702046FFF7C0FE0020C0B26C -:106C500070BDB0B504469C2001212154B425605973 -:106C6000002806D04068FEF7DBFE02462179204668 -:106C700090470835CC2DF2D12046FFF7DFFE2046A5 -:106C8000FFF7AEFE0020B0BD0223002A07D000238C -:106C9000022804D8C0000818B42142500023D8B2FA -:106CA000704780B5FFF7AEFE002080BDF0B581B023 -:106CB0000C4605460026B4272846314600F066F902 -:106CC000002807D0E8590068FEF7AAFE02462846C9 -:106CD000214690470837761C032EEDD1002001B0E5 -:106CE000F0BDF0B581B00C4605460026B427284615 -:106CF000314600F04BF9002807D0E8594068FEF70C -:106D00008FFE02462846214690470837761C032E00 -:106D1000EDD1002001B0F0BDB0B504462546A83540 -:106D2000284600F077FB942001212150AE20205A04 -:106D300098216050A820215C1F200840022808D01C -:106D400001280BD000280ED12046294600F02BF94F -:106D50000EE02046294600F0D8FA09E020462946F0 -:106D600000F0AFFA04E0802001402046FFF7BEFEAD -:106D70000020B0BDF0B583B0029204460191002915 -:106D80001CD025469C350027B4262046394600F005 -:106D9000FDF800280DD0A0598069002809D0297875 -:106DA000032906D1FEF73CFE034620460199029ACC -:106DB000984708367F1C032FE7D12FE094202058F6 -:106DC00003282BD1E16D206E81420AD9091AE165B1 -:106DD000814200D301468AB22046029900F0C7FDE5 -:106DE0001CE026469C360025B4272046294600F0A4 -:106DF000CDF800280BD0E0590069002807D0317881 -:106E0000032904D1FEF70CFE0146204688470837C7 -:106E10006D1C032DE9D1204600F0B0FD002003B029 -:106E2000F0BDF0B581B00446009100291BD0274683 -:106E30009C370026B4252046314600F0A7F80028EC -:106E40000CD060594069002808D03978032905D151 -:106E5000FEF7E6FD02462046009990470835761C6D -:106E6000032EE8D14DE094202058022842D1E06959 -:106E7000266AB0420AD9D022A1588919A150801B94 -:106E8000E06182B2204600F064FD33E0A569284647 -:106E9000314601F067FCB5420FD300290DD198208F -:106EA000205826469836854207D200252046294696 -:106EB0002A4600F04EFD35601CE026469C36002533 -:106EC000B4272046294600F061F800280BD0E0598D -:106ED000C068002807D03178032904D1FEF7A0FD4F -:106EE00001462046884708376D1C032DE9D120460E -:106EF00000F050FDA020205CA034012801D100202A -:106F00002070002001B0F0BD70B504469C20012126 -:106F100021544020206220660025B42620462946C0 -:106F200000F034F8002807D0A0594068FEF778FD3B -:106F3000024621792046904708366D1C032DEDD17D -:106F4000002070BD017400207047002070470020B1 -:106F5000704770B504469C20205C032814D100259E -:106F6000B4262046294600F011F8002808D0A05980 -:106F7000C069002804D0FEF753FD0146204688472B -:106F800008366D1C032DECD1002070BD0246002098 -:106F9000022907D8C8001018B4214158012000293F -:106FA00000D10846704780B54A78042A08DD072AD0 -:106FB0000FDC052A14D0062A1BD100F021F81DE0B1 -:106FC000002A10D0012A17D0032A12D100F034F978 -:106FD00014E0082A0AD0092A0BD100F0BDF80DE010 -:106FE00000F094F80AE000F005F907E000F0EBF893 -:106FF00004E000F0E3FB01E000F03BF9002080BD7D -:10700000B0B582B00D46044601A8002101806A880F -:10701000100A052812DC01281CD0022824D00328DD -:1070200037D1D0B2022839DC00285FD0012865D0E2 -:1070300002282ED1B0202058C0680EE006281CD0AF -:10704000072823D00F2824D1B0202058C069002859 -:1070500003D11EE0B02020580068FEF7E1FC024694 -:10706000207C01A990472FE0B420205800282CD084 -:10707000217C002922D0C06A21E0207C002808D190 -:10708000B4202058002804D0406B18E0207C002851 -:107090000ED02046294600F091FB25E0032829D098 -:1070A00004282FD00528F4D1B02020588069D4E7D7 -:1070B000B42020580028ECD0006B00E0806AFEF776 -:1070C000AFFC014601A88847014601A80288002AB2 -:1070D0000AD0E888002807D0824200D3024601A8DF -:1070E0000280204600F020FC02B0B0BDB020205845 -:1070F0004068B2E7B02020580069AEE7B0202058C1 -:107100008068AAE7B02020584069A6E770B5044619 -:10711000888800280BD1C888002808D148887F2695 -:1071200006409C20205C25469C35032803D1204640 -:1071300000F044FB70BD9E202654F1B22046FFF7BC -:1071400031FD204600F01AFC002E02D002202870EB -:1071500070BD0120287070BD70B50D460446AE7834 -:10716000022E1DD29C20215C20469C30032907D092 -:10717000022915D1002E22D066600321017009E09A -:10718000002E12D06068B04219D0C1B22046FFF77D -:10719000A8FD666020463146FFF788FD02280ED123 -:1071A0002046294600F00AFB70BD0221017066608E -:1071B00020463146FFF795FD204600F0DFFB2046D4 -:1071C00000F0DCFB70BD80B5CA88012A0AD19C2280 -:1071D000825C032A09D0022A04D100218160014681 -:1071E000083103E000F0EAFA80BD011D012200F041 -:1071F0009BFB80BDB0B504469C20205CFE22024073 -:10720000022A15D10120E060A420215825460C3522 -:107210000320002905D0204600F0BCFBE1680220D5 -:107220000843E06002222046294600F07DFBB0BD05 -:10723000204600F0C3FAB0BDB0B50D4604466888DC -:10724000012815D1A42001212150287902280CD829 -:10725000C0002018B4214058002806D08068FEF7EE -:10726000DFFB0246204629469047204600F086FB79 -:10727000B0BDB0B50D4604469C20205CFE21014007 -:10728000022919D1688801281AD1A420002121508F -:10729000287902280CD8C0002018B42140580028B2 -:1072A00006D08068FEF7BCFB024620462946904780 -:1072B000204600F063FBB0BD2046294600F07EFA70 -:1072C000B0BDB0B50D4604469C20205C032816D105 -:1072D0002879022813D8C0002018B421405800286B -:1072E0000DD08068FEF79CFB024620462946904759 -:1072F000E888002807D1204600F040FB03E0204644 -:10730000294600F05BFA0020B0BDB0B50D4604463A -:107310002878602202402979202A0FD102290DD82D -:10732000C8002018B4228058002807D08068FEF7D3 -:1073300077FB024620462946904769E06878002896 -:1073400016D001281DD0032862D19C20205C032880 -:107350001BD16888002807D180200843802803D0EB -:107360002046FFF7C3FB297902294ED8C80040E028 -:107370009C20205C032817D0022810D148060AD18F -:1073800046E09C20205C032827D0022807D18020DB -:10739000084380283CD02046FFF7A8FB38E0204671 -:1073A000294600F00BFA33E07F2008400001201846 -:1073B0000546543514308022114200D0054620463F -:1073C000FFF7DEFB0121002800D1014629600222DF -:1073D0002046294600F0A8FA1AE06888002817D14C -:1073E000480612D02046FFF7A7FB287902280CD8C0 -:1073F000C0002018B4214058002806D08068FEF74D -:107400000FFB0246204629469047204600F0B6FA78 -:107410000020B0BD0A7802704A7842708A78CB7832 -:107420001B02134343800A794B791B021343838069 -:107430008A79C97909021143C180704710B50446A1 -:107440008021FFF753FB00212046FFF74FFB10BDC3 -:1074500070B582B00D46044601A900200880694637 -:1074600008702A7860211140002910D0202938D1D5 -:1074700069780A460A3A022A33D302291BD0032923 -:1074800019D02046294600F099F9022029E06978B0 -:107490000B2913D00A290ED0062922D16888000AA8 -:1074A000002221280ED02228114616D101AE3046E6 -:1074B00000F058F80AE0694601220EE0204600F08C -:1074C0005DFA0DE001AE304600F032F80146328838 -:1074D000E888824200D302463280204600F024FA37 -:1074E0000020C0B202B070BDF0B581B00446822168 -:1074F0000326402532462B46FFF7B2FA02272046E4 -:10750000394632462B46FFF7ABFA204639462A4623 -:10751000FFF773FB002001B0F0BD10B504468221D7 -:10752000FFF7CEFA02212046FFF7CAFA002010BD6D -:10753000AC21094A515C0922012905D0002906D154 -:1075400007497944092204E00449794401E0002212 -:107550001146028008467047FC210020E621000009 -:10756000FA210000F0B581B00446AC201349085C54 -:107570002221002819D001281AD11048812103277F -:1075800040263A463346FFF76BFA01250B48294659 -:107590003A463346FFF764FA084829463246FFF771 -:1075A0002CFB08487844222104E00548784401E097 -:1075B00000210846218001B0F0BDC046FC2100201A -:1075C000BB210000A1210000F0B581B0044681215B -:1075D0000326402532462B46FFF742FA0127204674 -:1075E000394632462B46FFF73BFA204639462A46B3 -:1075F000FFF703FB002001B0F0BD000080B50129BA -:1076000003D103480121FEF75BFE002080BDC04688 -:107610005C210020B0B5144601290DD1012540227E -:107620002946FFF7EAFA2846FDF750FB02460348D1 -:1076300021462B46FEF7A6FF0020B0BD5C210020AE -:1076400080B5022903D103487844FDF79FFF00204D -:1076500080BDC04651D7FFFFB0B51446022919D1ED -:1076600002214022FFF7C9FA0B4DA879002811D159 -:107670000220FDF72BFB0246094878442146FDF71E -:10768000CBFE022806D1072028700120A8710348EC -:10769000006868800020B0BD3C210020E42100206B -:1076A0001FD7FFFF70B504468321032540262A46D5 -:1076B0003346FFF7D5F9204629462A463346FFF7D9 -:1076C000CFF9204629463246FFF797FA002070BDD1 -:1076D000002070470020704780B5032903D103487C -:1076E0007844FDF753FF002080BDC046C9D6FFFF98 -:1076F000B0B51446032919D103214022FFF77DFAC2 -:107700000B4DA879002811D10320FDF7DFFA0246BE -:10771000094878442146FDF77FFE022806D10B2058 -:1077200028700520A8710348006868800020B0BD5B -:107730003C210020E421002097D6FFFF1220088082 -:10774000014878447047C046CA22000004200880DF -:10775000014878447047C046CC2200000E200880C3 -:10776000014878447047C046C02200000E200880BF -:10777000014878447047C046BE2200000A200880B5 -:10778000014878447047C046BC2200000E200880A3 -:10779000014878447047C0469E2200000E200880B1 -:1077A000014878447047C0468E2200003920088086 -:1077B000014878447047C046D71F000080B50A785A -:1077C00052B2002A02DBFFF739FE80BD4A78772AE1 -:1077D0000FD0062AF7D14A88194B9A42F3D1CA88AA -:1077E0001221122A00D30A461649794400F09CF867 -:1077F00080BD8A88042A09D1CA882821282A00D372 -:107800000A461149794400F08FF880BD8A88052A1C -:1078100009D1CA889221922A00D30A460B49794499 -:1078200000F082F880BD8A88072ACCD1CA88B221AC -:10783000B22A00D30A460649794400F075F880BDA3 -:10784000EE030000FA1F0000F21F000000200000FD -:107850007820000070B5044623480025D42229462C -:10786000FDF7BBF9214E30460C3004222946FDF7C6 -:10787000B4F91036082230462946FDF7AEF9002C3F -:107880002DD0194C0025D42220462946FDF7A5F914 -:107890001949794420462A46FFF7C2F9174A7A4423 -:1078A00028462146FFF7F0F90120154A7A4421467F -:1078B000FFF7EAF9FF2252320D480E49FEF7F6FCB7 -:1078C0000220104A7A442146FFF7DEF903214022C4 -:1078D0002046FFF792F92046FFF7E3F970BD024812 -:1078E000FFF7B7F970BDC046FC2100203C21002005 -:1078F0005C210020E81F0020321F0000C62000008D -:10790000F02000001021000060210180014878442F -:107910007047C0463A2100000A210180014878449E -:107920007047C0468A210000B0B50C46942102235E -:107930004350D02144508261C261016A914200D813 -:107940000A4693B2002529462246FFF73DF928460C -:10795000B0BDB0B50C46016A914200D80A4693B258 -:10796000002529462246FFF72FF92846B0BD10B55D -:1079700000242146FFF741F9204610BD10B594219F -:10798000042242500024214622462346FFF71CF9D8 -:10799000204610BD10B594210522425000242146F6 -:1079A0002246FFF72AF9204610BD0000B0B5124963 -:1079B0000A780120012A1DD8521E0C235343CB18EC -:1079C0001A8B002A16D01969002913D09B8A002B24 -:1079D00006D194000C190325ED436459E41C09D128 -:1079E000934206D29A0089180322D2438958891CEF -:1079F00000D00020B0BDC046241D002010B50E49A7 -:107A00000A780120012A16D8521E0C235343CB18A2 -:107A10001A8B002A0FD0196900290CD09B8A541E9A -:107A20009C4208DD921E9A4204DD9A00891849683A -:107A3000891C00D0002010BD241D002008480178BA -:107A400000290AD00C224A4380184189028901206A -:107A50008A4203D8FF208A4200D3002040B27047F8 -:107A6000241D0020F0B581B00146164A1078012887 -:107A700026D8401E0C234343D218168B002E1FD04D -:107A80001569002D1CD0022E1AD3948A1346143384 -:107A9000771EA74214DDB61EA6420ADBA600AD196A -:107AA0006D68AE1C0CD0ED1C03D100211980D18271 -:107AB00004E0D482621C1A80002901D000F03EF854 -:107AC00001B0F0BD241D002080B50120FFF7CAFFE2 -:107AD00080BD0000B0B517490878012829D8401E9C -:107AE0000C22424389180A8B002A22D00C69002CF0 -:107AF0001FD0022A1DD38D8A0B461433002D0AD0C5 -:107B0000AA00A2180324E4431259921C11D0CD827A -:107B1000691E19800BE0950064190325ED43645933 -:107B2000E41C06D1044C14191C80521ECA8200F0B9 -:107B300005F8B0BD241D0020FEFF0000F0B581B0A7 -:107B400004460C2060431A490E183069B18A890036 -:107B500040583746143710360321C943884224D889 -:107B6000FDF75EFF31683A8892008958056808463B -:107B7000FDF756FF002D06D00068FDF751FF0146C6 -:107B80002046884711E08068FDF74AFF05463068C7 -:107B9000398889004058FDF743FF4068FDF740FFF2 -:107BA00002462046294600F061F801B0F0BDC0460B -:107BB000241D0020F0B581B02B4D2878012825D850 -:107BC000401E0C2670432A18108B00281ED0116905 -:107BD00000291BD0928A824218D290000858FDF7E3 -:107BE0001FFF806829784C1E6643002810D0A81912 -:107BF0000169808A80000858FDF712FF8068FDF750 -:107C00000FFF01460022204600F030F801B0F0BD21 -:107C1000A819038B002BF9D0828A014614319B1ED0 -:107C20009342F3DB05699600AE1900967768FE1C57 -:107C300013D0BE1CEAD1009E7668B61C09D1521C36 -:107C400096B2B34204DBB600AE197668B61CF6D025 -:107C50000A80C282501C088002E000220A80C28290 -:107C60002046FFF76BFFD1E7241D0020F0B583B05D -:107C700001920C460C221146029041431F4B5F18A3 -:107C80000021398339617961181DFCF7A6FF204670 -:107C90003C4610343D4618353E461636143700280B -:107CA0002AD0FDF7BDFE206029888A008258521C28 -:107CB00006D0491C8AB292008258521CF9D1298000 -:107CC0000198002815D0FDF7ABFE054620683988DD -:107CD000890040580BE0FDF7A3FEA84209D0388880 -:107CE0003080401C388080B2800021680858411CD8 -:107CF000F1D10298FFF722FF03B0F0BD241D002050 -:107D000080B50A49884208D00949884208D0094903 -:107D1000884208D1FFF7DEFE05E0FFF74BFF02E0E7 -:107D20000120FFF79FFE002080BDC04603000080B9 -:107D3000020000800100008010B5014600200029EB -:107D40000FD1084C218BA28A8A420AD22069FDF702 -:107D500067FEA18A89004058FDF762FE4068FDF782 -:107D60005FFE10BD241D002080B503480078401E32 -:107D7000FFF7E2FF80BDC046241D002010B5044679 -:107D800000F00CFC2420604308490818C421052297 -:107D90004254C021064A7A444250BD210122425435 -:107DA000D021044A7A44425010BDC046241D002010 -:107DB0001E1D000059FFFFFF80B500F0FFFA9D2255 -:107DC000002806D003498A5C112A02D1B422024B52 -:107DD0008B5280BD241D00200A80000010B504468F -:107DE000FFF7CCFF2420604304490818CC21044A43 -:107DF0007A444250204600F0A7FB10BD241D00200D -:107E0000C5FFFFFF80B500F0D9FA9D22002806D0FB -:107E100003498A5C102A02D3B422024B8B5280BDE4 -:107E2000241D00200A80000010B50446FFF7A6FFBD -:107E30002420604304490818CC21044A7A44425063 -:107E4000204600F081FB10BD241D0020C5FFFFFF70 -:107E500070B50546FFF788FF0446114E30469C304A -:107E600020222946FCF7A3FE68780146103905292F -:107E70000AD29D20305C0F21014088002058B82193 -:107E800070509C36304670BD022803D00128F8D1CE -:107E9000616800E0E16800200029F2D1F3E7C04604 -:107EA000241D002010B5044600F078FB2420604318 -:107EB0000B490818C42106224254C021094A7A44B9 -:107EC0004250BD2101224254CC21074A7A444250FB -:107ED000D021064A7A444250204600F035FB10BDBE -:107EE000241D0020961C000081FFFFFF29FEFFFFDC -:107EF000F0B587B00E46FFF71FFF06904B4C2046AB -:107F00000C300025022729463A46FCF766FE20463B -:107F10000E30059529463A46FCF75FFE701C04902A -:107F200002D0A06800287DD006984068FDF778FD53 -:107F3000054600F065FE291801220592012871DB33 -:107F400060680590A068029000200390069001955B -:107F50002B468B42039C1A4620D200201A46044628 -:107F600026469D19C01D741C722813D82F781F2F08 -:107F700004DD202F09D02D2F07D003E0092F04D0D6 -:107F80000A2F09D05F2F00D015462A461D198D42B1 -:107F9000E6D303E0344601E09A19741C18198842AC -:107FA00024D2002C069D22D09A4220D00025ED43F9 -:107FB000455D2C2D06DC2E46093E022E16D3202DC3 -:107FC00014D003E02D2D11D05F2D0FD000782C2878 -:107FD00005DC0546093D022D08D3202802E02D28A6 -:107FE00004D05F28069D02D0D41A00E0069D0498B4 -:107FF000002806D00598A84203D10598029A90421D -:108000000AD31B19681C8B4200D328468B4206906A -:108010009FD3401C059005E004480146CC8101989F -:10802000181A8881059807B0F0BDC046241D0020AD -:10803000B0B50446FFF7A2FE094D69682046FFF778 -:1080400057FF242060432818CC21064A7A44425026 -:10805000D021054A7A444250204600F075FAB0BD5E -:10806000241D00201D00000015010000F0B583B0A4 -:108070000546FFF779FE0446374E30469C302022F5 -:108080002946FCF794FD6878102816DC012833D0C7 -:1080900002283BD010285AD12068002841D0B4686B -:1080A000FDF7BEFC03467068B1686A46401C03C217 -:1080B000012C41D82A4A7A4440E00146113903296B -:1080C00045D20F210840401E40003718FD89002D81 -:1080D0003DD06068FDF7A4FCB98940186946086086 -:1080E00034461C348021204A7A4420462B46FDF732 -:1080F000C3FAB82034502AE0FFF758FC01460020AC -:10810000002924D07168002923D020E0FFF776FCF5 -:1081100000281CD07168B068421E0020914216D120 -:1081200017E07168B0686A46106030461C304B1C1E -:1081300080210C4A7A4404E0084A7A4430461C30D4 -:108140008021FDF799FA30461C30B82170509C36DA -:10815000304603B0F0BDC046241D0020DA1A0000EE -:10816000FA110000EB1A00003D1B000080B5174912 -:1081700088420BD01649884213D01649884222D132 -:108180001548416800291CD0491E14E0124988682E -:10819000002803D04968401E884214D1FFF70AFD29 -:1081A00011E00D4841688268521E914202D1FFF7EA -:1081B0008BFC08E0491C41600078401EFFF738FF47 -:1081C00001E0FFF787FC002080BDC046030000806F -:1081D0000200008001000080241D002070B50446CC -:1081E000FFF72CFC01280BD0401C0FD11C4E301D7A -:1081F00000250C222946FCF7F0FCE843706005E0FE -:108200001748001D00210C22FCF7E7FC204600F077 -:10821000C5F92046FFF790FD4068002819D00020DE -:10822000C1432046FFF764FE0D4DA860002807D12A -:10823000281D00210C22FCF7D0FCA868002804D0DF -:10824000401E6968814200D968602046FFF7F0FE51 -:1082500070BD0348001D00210C22FCF7BEFC70BD60 -:10826000241D002070B50546FFF77EFD0446124E22 -:1082700030469C3020222946FCF799FC68780F286C -:1082800006DC01280AD0022812D1FFF7B7FB07E06D -:1082900010280AD011280BD1606807E0FFF786FB91 -:1082A00001460020002903D070BD2068B82170501D -:1082B0009C36304670BDC046241D002010B50446D3 -:1082C00000F06CF9242060430B490818C4210522F2 -:1082D0004254C021094A7A444250BD2101224254ED -:1082E000CC21074A7A444250D021064A7A4442506F -:1082F000204600F029F910BD241D00205619000069 -:108300007DFFFFFF11FAFFFF70B50546FFF72CFD5B -:108310000446164E30469C3020222946FCF747FC86 -:1083200068780F2807DC012812D0022813D00F2804 -:1083300018D1206809E01038022813D29D20305C43 -:108340000F210140880020184068B821705009E0D2 -:10835000FFF72CFB01E0FFF751FB0146002000294D -:1083600000D070BD9C36304670BDC046241D002034 -:1083700010B5044600F012F9242060430B49081898 -:10838000C42106224254C021094A7A444250BD21E8 -:1083900001224254D021074A7A444250CC21064A55 -:1083A0007A444250204600F0CFF810BD241D002032 -:1083B0004219000065F9FFFF65FFFFFF70B5054634 -:1083C000FFF7D2FC0446124E30469C30202229464C -:1083D000FCF7EDFB6878022804D0012809D1FFF7EB -:1083E000E5FA01E0FFF70AFB0146002000290BD067 -:1083F00070BD9D20305CF021084205D00F2108405F -:1084000080002058B82170509C36304670BDC04660 -:10841000241D0020B0B51749884211D01649884262 -:1084200015D01649884222D1F820154C2158E02554 -:108430006059401E8847002819D06059401E11E03D -:10844000E0200F490858FC22895888470FE0F8209F -:108450000B4C2158E0256059401C8847002806D065 -:108460006059401C60512078401E00F00BF800203D -:10847000B0BDC04603000080020000800100008003 -:10848000241D0020F0B581B004460120C6430C4DE8 -:108490002F46E437F8202958E0202858301888471C -:1084A00001C7761C032EF5D12046FFF7FBFC2420E4 -:1084B00060432818D021034A7A44425001B0F0BDED -:1084C000241D002059FFFFFFB0B50446F8200B4DD6 -:1084D0002950E0202B50FC202A502046FFF72CFC8E -:1084E000E435A84206D00649794400222046FFF729 -:1084F000BDFBB0BD2046FFF7C5FFB0BD241D002069 -:10850000B418000080B50023FFF7DEFF80BD000037 -:10851000B0B50C4D2878002811D12846BC30002475 -:1085200024222146FCF759FB28780C2250432818B6 -:1085300010302146FCF751FB2878401C2870C0B24F -:10854000401EB0BD241D0020B0B50446124802787C -:10855000002A0ED0611C91420BD1242161434518A1 -:10856000FCF7AEFCBE2000212952204600F02AF87C -:10857000B0BD01210023002A0A4600D01A46641C1F -:1085800000D019461143012904D14178AA2901D10B -:1085900069214170B0BDC046241D002070B524245F -:1085A000604307490E18FCF78BFC3046BC300025B1 -:1085B00029462246FCF711FBBC20355470BDC0464D -:1085C000241D0020F0B581B004460420FDF7EEFC28 -:1085D00000283CD097283AD0242060431D490C182D -:1085E000C02020582546C0352646BE3600282ED04D -:1085F0002046CC300090C4343088AA27217880B23D -:10860000884224D2FDF79EFC002820D1FDF71CFCF7 -:10861000B84203D1FDF742FCB84218D1286831882E -:108620004901401800990968002902D088470028AC -:1086300007D0012803D12868318849014018FBF789 -:10864000A2FB3088401C308029680029D6D101B0B7 -:10865000F0BDC046241D0020002243088B4274D385 -:1086600003098B425FD3030A8B4244D3030B8B4233 -:1086700028D3030C8B420DD3FF22090212BA030C3C -:108680008B4202D31212090265D0030B8B4219D31D -:1086900000E0090AC30B8B4201D3CB03C01A52413D -:1086A000830B8B4201D38B03C01A5241430B8B4285 -:1086B00001D34B03C01A5241030B8B4201D30B036E -:1086C000C01A5241C30A8B4201D3CB02C01A524195 -:1086D000830A8B4201D38B02C01A5241430A8B4258 -:1086E00001D34B02C01A5241030A8B4201D30B0241 -:1086F000C01A5241CDD2C3098B4201D3CB01C01A5B -:10870000524183098B4201D38B01C01A5241430964 -:108710008B4201D34B01C01A524103098B4201D352 -:108720000B01C01A5241C3088B4201D3CB00C01ABF -:10873000524183088B4201D38B00C01A5241430837 -:108740008B4201D34B00C01A5241411A00D201465C -:10875000524110467047FFE701B5002000F0F0F8E5 -:1087600002BDC0460029F7D076E7704703460B43A9 -:108770007FD4002243088B4274D303098B425FD31A -:10878000030A8B4244D3030B8B4228D3030C8B4246 -:108790000DD3FF22090212BA030C8B4202D312122C -:1087A000090265D0030B8B4219D300E0090AC30B01 -:1087B0008B4201D3CB03C01A5241830B8B4201D3AE -:1087C0008B03C01A5241430B8B4201D34B03C01A97 -:1087D0005241030B8B4201D30B03C01A5241C30A0F -:1087E0008B4201D3CB02C01A5241830A8B4201D380 -:1087F0008B02C01A5241430A8B4201D34B02C01A6A -:108800005241030A8B4201D30B02C01A5241CDD20E -:10881000C3098B4201D3CB01C01A524183098B4259 -:1088200001D38B01C01A524143098B4201D34B0142 -:10883000C01A524103098B4201D30B01C01A5241A5 -:10884000C3088B4201D3CB00C01A524183088B422C -:1088500001D38B00C01A524143088B4201D34B0015 -:10886000C01A5241411A00D2014652411046704787 -:108870005DE0CA0F00D04942031000D3404253408C -:1088800000229C4603098B422DD3030A8B4212D34C -:10889000FC22890112BA030A8B420CD3890192117E -:1088A0008B4208D3890192118B4204D389013AD0BB -:1088B000921100E08909C3098B4201D3CB01C01A90 -:1088C000524183098B4201D38B01C01A52414309A3 -:1088D0008B4201D34B01C01A524103098B4201D391 -:1088E0000B01C01A5241C3088B4201D3CB00C01AFE -:1088F000524183088B4201D38B00C01A5241D9D216 -:1089000043088B4201D34B00C01A5241411A00D296 -:108910000146634652415B10104601D34042002B92 -:1089200000D54942704763465B1000D3404201B511 -:10893000002000F005F802BD0029F8D016E77047C6 -:108940007047C04610B5002200F00AF810BDC046BE -:1089500010B500F031F810BD10B500F07FF810BD73 -:108960000B0010B511001A0000F0D4F810BDC0467D -:1089700030B5032A0CD903000B439B0719D10368B8 -:108980000C68A34215D1043A04300431032AF6D806 -:10899000551E002A0BD0002303E05A1C9D4206D02E -:1089A0001300C25CCC5CA242F7D0101B00E0002098 -:1089B00030BD551EEFE7C046F0B5C64600B50F2ADC -:1089C00041D903270D003E0005430C0003002E4053 -:1089D0002F423DD11500103D2D09AC462D01A84672 -:1089E0008044256867681D605F60A568E7689D60D2 -:1089F000DF6010341F0010334745F2D165460F2366 -:108A00000C2401352D01491913404519144222D077 -:108A10008C59AC5104369C1B032CF9D80324043B1D -:108A20009B0801339B002240ED18C918561E002AEE -:108A300006D00023CC5C1A00EC5401339642F9D1E5 -:108A400080BCB846F0BD0500561E002AF1D1F7E7FC -:108A50000500561EEDE71A00F6E7C046F0B5C6461B -:108A600000B588420CD98B18984209D2531E002AAF -:108A700003D0CA5CC254013BFBD280BCB846F0BDF7 -:108A80000F2A0BD80500561E002AF6D00023CC5C16 -:108A90001A00EC5401339642F9D1EEE703270D009A -:108AA0003E0005430C0003002E402F422CD1150040 -:108AB000103D2D09AC462D01A846804425681F00B5 -:108AC0001D6065685D60A5689D60E5681034DD60C7 -:108AD00010334745F2D165460F230C2401352D0193 -:108AE000491913404519144211D08C59AC51043620 -:108AF0009C1B032CF9D80324043B9B0801339B00E7 -:108B0000ED18C9182240BEE70500561EBEE71A0040 -:108B1000B9E7C046F0B5050083074AD0541E002AC5 -:108B200044D003000322CEB202E00135013C3DD324 -:108B300001332E701342F8D1032C2FD9FF220A40A3 -:108B4000150215432A0415430F2C35D92700103F71 -:108B50003F093E01B4461E001A00103666441560F7 -:108B600055609560D5601032B242F8D10F260C22C4 -:108B700001373F012640DB193700224217D03E1F44 -:108B8000B608B400A4461A001C1D644420C2A242C8 -:108B9000FCD103240136B6009B193C40002C05D0C3 -:108BA000C9B21C19197001339C42FBD1F0BD3400CD -:108BB000F4E714000300BFE72700E0E7F0C04146F8 -:108BC0004A4653465C466D4676467EC02838F0C815 -:108BD0000020704710307CC890469946A246AB46AC -:108BE000B54608C82838F0C8081C00D1012018472D -:108BF00003000A7801311A700133002AF9D1704755 -:108C000010B583070AD00300032102E001330B42B1 -:108C100005D01A78002AF9D1181A10BD0300196876 -:108C20000C4A0D4C8A188A4322420FD15968094ACE -:108C300004338A188A43224208D15968054A04330A -:108C40008A188A432242F1D000E001331A78002AC0 -:108C5000FBD1E1E7FFFEFEFE8080808030B5002A78 -:108C600028D003000B439B0713D1032A11D9134DBE -:108C70000BE0043A002A1DD0114C1C199C432C42D5 -:108C800018D104300431032A03D903680C68A342C5 -:108C9000EFD004780D78A5420ED1012A0AD0012325 -:108CA00006E0C45CCD5CAC4206D101339A4201D0EF -:108CB000002CF6D1002030BD601BFCE78080808056 -:108CC000FFFEFEFEF0B50C00044303000600A407FF -:108CD00012D1032A10D9144CA44666460D68134CD1 -:108CE0001F002C19AC4334421CD10433043A1E003B -:108CF00004313D60032AF0D80024B71806E00D5D6A -:108D0000013A3555BB1A0134002D02D0002AF6D1A4 -:108D1000F0BD0021D418002AFAD0197001339C420A -:108D2000FBD1F5E71E00E7E780808080FFFEFEFEB6 -:108D300030B5050008002B006C18002903D106E0AF -:108D400001339C4203D01A78002AF9D1581B30BD58 -:108D500025303858001976A91488AC17A914873D16 -:108D6000A91487209EC9845ACB02FAB24E1C03680C -:108D7000B3B517C1A4488FBA97F0E3459AC053EA38 -:108D80000100000003C01F02B41600142200203F9F -:108D900076A91488AC209EC9845ACB02FAB24E1C24 -:108DA0000368B3B517C1A4488FBA97F0E3459AC0DA -:108DB00053EA0100000003C01F02B4232102232153 -:108DC00003434104AC25750031323334353637382E -:108DD0003941424344454647484A4B4C4D4E505119 -:108DE00052535455565758595A61626364656667C1 -:108DF00068696A6B6D6E6F7071727374757677786F -:108E0000797AE0E0E0E0E0E0E0E0E0E0E0E0E020EF -:108E1000222426404244484A4EC0C41601010001A3 -:108E2000010101010101000000000000A117D0C0F4 -:108E3000B11CD0C07103D0C0DD16D0C0CD05D0C0EC -:108E40002504D0C00912D0C00914D0C08910D0C0E8 -:108E5000411CD0C0E903D0C02503D0C05502D0C00A -:108E6000626974636F696E636173680071707A72AE -:108E700079397838676632747664773073336A6E1E -:108E800035346B686365366D7561376C00000000C2 -:108E900000000000FFFFFF00000000000C400BF886 -:108EA00007FCC0F3F03CF003FE012D0003000000BE -:108EB000000000000E0000000E0000000100000095 -:108EC000908ED0C0988ED0C000000000FFFFFF0041 -:108ED000008001E6C071383807FC001E8007F003EF -:108EE000CEC1E13870061800000000000E0000003E -:108EF0000E00000001000000C88ED0C0D08ED0C08F -:108F000000000000FFFFFF00000000000C8007F0E1 -:108F100003FEC1FFF03FF003CC0033C00C000000A3 -:108F2000000000000E0000000E0000000100000024 -:108F3000008FD0C0088FD0C000000000FFFFFF00EE -:108F400041110501070000000400000001000000BD -:108F5000388FD0C0408FD0C000000000FFFFFF005E -:108F6000000000001EE01F1C0E03638C19630C0C34 -:108F700087837F8007000000000000000E000000D3 -:108F80000E00000001000000588FD0C0608FD0C0DC -:108F900000000000FFFFFF0048124208040000002C -:108FA0000700000001000000908FD0C0988FD0C053 -:108FB00000000000FFFFFF002184240104000000E6 -:108FC0000700000001000000B08FD0C0B88FD0C0F3 -:108FD00000000000FFFFFF00088A280807000000CB -:108FE0000400000001000000D08FD0C0D88FD0C096 -:108FF00000000000FFFFFF00000000000000C000B4 -:10900000380067E0381C9C037E000F8001000000E0 -:10901000000000000E0000000E0000000100000033 -:10902000F08FD0C0F88FD0C000000000FFFFFF001D -:10903000000030000C80072001CC0033E01C380712 -:10904000FFC3F3F87CFE1F00000000000E000000CC -:109050000E000000010000002890D0C03090D0C069 -:109060004175746F20417070726F76616C004D6154 -:109070006E75616C20417070726F76616C00426138 -:10908000636B005075626C6963206B657973206552 -:1090900078706F7274004170706C69636174696F8D -:1090A0006E00697320726561647900536574746938 -:1090B0006E67730056657273696F6E00312E352EC0 -:1090C000330051756974005369676E006D65737381 -:1090D000616765004D6573736167652068617368DA -:1090E0000043616E63656C007369676E61747572CD -:1090F0006500526576696577007472616E736163AD -:1091000074696F6E00416D6F756E740041646472B6 -:109110006573730046656573004163636570740031 -:10912000616E642073656E640052656A65637400E5 -:109130004F505F53454E44455200436F6E6669720F -:109140006D005468652064657269766174696F6E3C -:10915000007061746820697320756E757375616C39 -:10916000210044657269766174696F6E2070617464 -:10917000680052656A65637420696620796F752797 -:109180007265006E6F742073757265004170707245 -:109190006F76652064657269766174696F6E0041EF -:1091A0007070726F766500436F6E6669726D2074C1 -:1091B0006F6B656E004578706F7274007075626CCD -:1091C0006963206B65793F00546865206368616E50 -:1091D0006765207061746800697320756E757375BA -:1091E000616C004368616E6765207061746800544B -:1091F0006865207369676E207061746800536967E1 -:109200006E207061746800556E7665726966696576 -:109210006420696E707574730055706461746500C4 -:10922000204C6564676572204C697665006F72201A -:1092300074686972642070617274790077616C6C13 -:10924000657420736F66747761726500436F6E7426 -:10925000696E7565004F505F53454E4445525F43FC -:109260005245415445004F505F43524541544500DB -:109270004C0E968C0044656C656761746520746F54 -:109280002025732028666565202564202525290072 -:109290003D666E8B003031323334353637383941E4 -:1092A00042434445460043616C6C20636F6E7472A8 -:1092B000616374202573006F6D6E69004F4D4E49D8 -:1092C00020005553445420004D41494420004F4D47 -:1092D0004E492061737365742025642000252E2A71 -:1092E000482E2E2E252E2A48006F75747075742016 -:1092F000232564005174756D005154554D007471EF -:10930000000000006090D0C06E90D0C07E90D0C0B1 -:109310008390D0C07E90D0C09690D0C0A290D0C094 -:10932000297ED0C01893D0C00000000000000000CB -:10933000D13CD0C000000000000000000000000090 -:109340003093D0C0FFFFFFFFB48ED0C0AB90D0C031 -:10935000BD82D0C04893D0C04093D0C00000000070 -:10936000B490D0C0BC90D0C0DD7DD0C06093D0C0E0 -:109370000000000000000000ED3CD0C00000000034 -:1093800000000000000000007893D0C0FFFFFFFF46 -:10939000248FD0C0C290D0C0BD82D0C09093D0C026 -:1093A0008893D0C0000000002093D0C05093D0C05C -:1093B0006893D0C09893D0C0FDFFFFFFFFFFFFFF71 -:1093C000F73CD0C0000000000000000000000000DA -:1093D000C093D0C0FFFFFFFF1490D0C0A791D0C0B2 -:1093E000B02000207183D0C0D893D0C0D093D0C01B -:1093F00000000000053DD0C000000000000000009B -:1094000000000000F493D0C0FFFFFFFFEC8ED0C03F -:109410002991D0C0BD82D0C00C94D0C00494D0C0DB -:1094200000000000E493D0C01494D0C0FFFFFFFF01 -:10943000133DD0C00000000000000000000000004C -:109440003094D0C0FFFFFFFF1490D0C0B591D0C0C2 -:10945000BC91D0C07183D0C04894D0C04094D0C0DB -:1094600000000000213DD0C000000000000000000E -:10947000000000006494D0C0FFFFFFFFEC8ED0C05E -:109480002991D0C0BD82D0C07C94D0C07494D0C08B -:10949000000000005494D0C08494D0C0FFFFFFFFB0 -:1094A0007C8FD0C0C891D0C0D891D0C07183D0C0BB -:1094B000A094D0C00000000000000000E391D0C0E4 -:1094C00000180020DD81D0C0BC94D0C00000000096 -:1094D000000000002F3DD0C0000000000000000090 -:1094E00000000000D494D0C0FFFFFFFFEC8ED0C07E -:1094F0007291D0C08391D0C07183D0C0EC94D0C0A1 -:10950000E494D0C0000000003D3DD0C00000000049 -:1095100000000000000000000895D0C0FFFFFFFF22 -:109520001490D0C09F91D0C0BD82D0C02095D0C033 -:109530001895D0C000000000AC94D0C0C494D0C036 -:10954000F894D0C02895D0C0FFFFFFFF7C8FD0C01B -:10955000EF91D0C0D891D0C07183D0C04C95D0C00D -:109560000000000000000000FD91D0C000180020A5 -:10957000DD81D0C06895D0C0000000000000000070 -:109580004B3DD0C0000000000000000000000000C3 -:109590008095D0C0FFFFFFFFEC8ED0C07291D0C08D -:1095A0008391D0C07183D0C09895D0C09095D0C021 -:1095B000000000005B3DD0C0000000000000000083 -:1095C00000000000B495D0C0FFFFFFFF1490D0C092 -:1095D0009F91D0C0BD82D0C0CC95D0C0C495D0C022 -:1095E000000000005895D0C07095D0C0A495D0C0A0 -:1095F000D495D0C0FFFFFFFF4C90D0C00792D0C0E1 -:10960000BD82D0C0F895D0C000000000000000006E -:109610001992D0C02092D0C0297ED0C01096D0C060 -:1096200000000000000000002D92D0C03C92D0C08D -:10963000297ED0C02896D0C00000000000000000A5 -:109640006B3DD0C0000000000000000000000000E2 -:109650004096D0C0FFFFFFFFEC8ED0C0E190D0C09D -:10966000BD82D0C05896D0C05096D0C00000000037 -:10967000793DD0C0000000000000000000000000A4 -:109680007096D0C0FFFFFFFF1490D0C04C92D0C0A6 -:10969000BD82D0C08896D0C08096D0C000000000A7 -:1096A0000096D0C01896D0C03096D0C06096D0C07A -:1096B0009096D0C0FFFFFFFF4F505F524554555268 -:1096C0004E000000556E64656C656761746500004E -:1096D00000000000B001000000B0A7000000B002D0 -:1096E0000000003031323334353637383961626347 -:1096F0006465663031323334353637383941424368 -:109700004445466F00900167006985F1D000000074 -:10971000004254430090009000006A805532465F3A -:1097200056329000010990006E006D00FFFFFFFFB0 -:109730000000000009211101210122220000000087 -:1097400009211101000122220006D0F10901A10125 -:109750000903150026FF00750895408108090415C6 -:109760000026FF00750895409108C006A0FF09017A -:10977000A1010903150026FF00750895408108091D -:1097800004150026FF00750895409108C0050F39A3 -:1097900000021810050038B60834A909A0478BFD4F -:1097A000A0768815B66500011E001C100500DF605C -:1097B000DDD88945C74C9CD2659D9E648A9F000078 -:1097C0000306B200770000003D77D0C04D77D0C0CF -:1097D0005D77D0C06D77D0C07D77D0C08D77D0C099 -:1097E0009D77D0C0AD77D0C012034D005300460026 -:1097F00054003100300030007700280000000001E4 -:1098000004000100000000000000020157494E550D -:1098100053420000000000000000000000000000B3 -:109820000000920000000001050001008800000017 -:10983000070000002A00440065007600690063000C -:10984000650049006E0074006500720066006100EA -:1098500063006500470055004900440073000000A4 -:10986000500000007B0031003300640036003300FC -:109870003400300030002D00320043003900370042 -:109880002D0030003000300034002D00300030005A -:10989000300030002D003400630036003500360003 -:1098A00034003600370036003500370032007D00C6 -:1098B000000000000A00000000000306B2000800DB -:1098C00001000000A800080002000200A00014002F -:1098D000030057494E5553420000000000000000AD -:1098E00000008400040007002A00440065007600A0 -:1098F00069006300650049006E0074006500720035 -:10990000660061006300650047005500490044009F -:109910007300000050007B00430045003800300019 -:1099200039003200360034002D003400420032008D -:1099300034002D0034004500380031002D00410076 -:109940003800420032002D00350037004500440049 -:10995000300031004400350038003000450031004F -:109960007D00000000000000E974D0C01B75D0C06D -:109970005174D0C000000000000000004176D0C04B -:109980005976D0C000000000000000000000000078 -:109990000979D0C00979D0C00979D0C01979D0C06F -:1099A000C975D0C01B75D0C05174D0C00000000074 -:1099B00000000000FD75D0C01576D0C0000000008A -:1099C00000000000000000000979D0C00979D0C073 -:1099D0000979D0C01979D0C0A576D0C0D176D0C0D1 -:1099E000D576D0C00000000000000000D976D0C0BD -:1099F000F176D0C000000000000000000000000070 -:109A00000979D0C00979D0C00979D0C01979D0C0FE -:109A10001201100200000040972C01000102010217 -:109A20000301040309040E034C0065006400670091 -:109A3000650072000E034E0061006E006F00200092 -:109A400053000A033000300030003100090260008A -:109A5000030102C0320904000002030000020921D0 -:109A600011010001222200070582034000010705C1 -:109A7000020340000109040100020301010209215F -:109A80001101210122220007058103400001070581 -:109A900001034000010904020002FFFFFF02070565 -:109AA0008303400001070503034000010A0600028A -:109AB00000000040010000000300000000008000E2 -:109AC000200000000100000000000000FFFFFF0078 -:109AD0000000000000000000050102000C0004006E -:109AE0000700000000000000FFFFFF000000000072 -:109AF000000000009C8FD0C005027A000C0004001A -:109B00000700000000000000FFFFFF000000000051 -:109B100000000000BC8FD0C0071000000C008000C7 -:109B20002000000000000000FFFFFF000000000018 -:109B30000880000000000000071100001A008000EB -:109B40002000000000000000FFFFFF0000000000F8 -:109B500008800000000000000300000000008000FA -:109B6000200000000100000000000000FFFFFF00D7 -:109B70000000000000000000050100000E000700CA -:109B80000400000000000000FFFFFF0000000000D4 -:109B900000000000DC8FD0C0050278000E00070036 -:109BA0000400000000000000FFFFFF0000000000B4 -:109BB00000000000448FD0C00711000003008000A7 -:109BC0002000000000000000FFFFFF000000000078 -:109BD0000A8000000000000007120000130080004F -:109BE0002000000000000000FFFFFF000000000058 -:109BF0000880000000000000071300002300800020 -:109C00002000000000000000FFFFFF000000000037 -:109C10000A800000000000002573202825642F25FD -:109C200064290025642F256400252E2A7300000076 -:109C30000300000000008000200000000100000080 -:109C400000000000FFFFFF00000000000000000017 -:109C5000050102000C0004000700000000000000E5 -:109C6000FFFFFF0000000000000000009C8FD0C03C -:109C700005027A000C00040007000000000000004C -:109C8000FFFFFF000000000000000000BC8FD0C0FC -:109C90000510380002001000100000000000000055 -:109CA000FFFFFF00000000000A800000000000002D -:109CB000071100001C0080002000000000000000D0 -:109CC000FFFFFF000000000008800000000000000F -:109CD00003000000000080002000000001000000E0 -:109CE00000000000FFFFFF00000000000000000077 -:109CF000050102000C000400070000000000000045 -:109D0000FFFFFF0000000000000000009C8FD0C09B -:109D100005027A000C0004000700000000000000AB -:109D2000FFFFFF000000000000000000BC8FD0C05B -:109D3000050F1000080010001000000000000000D7 -:109D4000FFFFFF0000000000000000000000000016 -:109D5000071029000C008000200000000000000017 -:109D6000FFFFFF00000000000800000000000000EE -:109D7000071129001A0080002000000000000000E8 -:109D8000FFFFFF00000000000800000000000000CE -:109D90008584D0C0081E00200000000000000000E4 -:109DA000909DD0C0FFFFFFFF0000000000000000FA -:109DB00000000000000000000000000000000000A3 -:109DC0000000000000000000000000000000000093 -:109DD0000000000000000000000000000000000083 -:109DE0000000000000000000000000000000000073 -:109DF0000000000000000000000000000000000063 -:04000005C0D0000166 -:00000001FF diff --git a/src/qt/res/ledger/nanos_stake_test_delete.txt b/src/qt/res/ledger/nanos_stake_test_delete.txt deleted file mode 100644 index 9070adcc47..0000000000 --- a/src/qt/res/ledger/nanos_stake_test_delete.txt +++ /dev/null @@ -1 +0,0 @@ -python3 -m ledgerblue.deleteApp --targetId 0x31100004 --appName "Qtum Stake Test" --rootPrivateKey fea057826208738ba33ff0e1ebb8ebf682ab73753afb2d988df03b1b59187d58 diff --git a/src/qt/res/ledger/nanos_stake_test_load.txt b/src/qt/res/ledger/nanos_stake_test_load.txt deleted file mode 100644 index 4f27369b55..0000000000 --- a/src/qt/res/ledger/nanos_stake_test_load.txt +++ /dev/null @@ -1 +0,0 @@ -python3 -m ledgerblue.loadApp --curve secp256k1 --tlv --targetId 0x31100004 --targetVersion="1.6.1" --delete --fileName :/ledger/nanos_stake_test_app --appName "Qtum Stake Test" --appVersion 1.5.3 --dataSize 64 --icon 010000000000ffffffffffffffffff1ffc0ff847f1a7f247f1a7f247f10ff01fe0fff7ffffffffffff --rootPrivateKey fea057826208738ba33ff0e1ebb8ebf682ab73753afb2d988df03b1b59187d58 --path "" --path "44'/1'" --path "45'/1'" --path "48'/1'" --path "49'/1'" --path "84'/1'" --path "0'/45342'" --path "20698'/3053'/12648430'" --appFlags 0xa50 diff --git a/src/qt/res/ledger/nanos_test_app.hex b/src/qt/res/ledger/nanos_test_app.hex deleted file mode 100644 index addebe881e..0000000000 --- a/src/qt/res/ledger/nanos_test_app.hex +++ /dev/null @@ -1,2655 +0,0 @@ -:02000004C0D06A -:1000000010B5044662B604F043FF002C0DD0012069 -:1000100000022168814205D1606801280AD1A068E8 -:10002000002803D104F004FE02E0002004F024FEC6 -:10003000002010BD204604F0A1FEF0B581B00446BA -:100040000020002A1CD00B780A2B19D89D0001260D -:100050003543954214D82370002B10D00096271DED -:100060004D1C002601210022284602F029FA01C772 -:100070002D1D761C20788642F4D3009800E030468F -:1000800001B0F0BDF0B58FB0012040024A4C00270E -:1000900001902754FF2040000290275203AE3046C3 -:1000A00008F044FF0546B585A8B2002812D01028F4 -:1000B00077D003A887850D9806F0E2F80220029910 -:1000C00060523F486F21017045700121204602F0C7 -:1000D0008BFD58E003A806F0D3F80D90208802F0BD -:1000E0008AFD2078002802D03448029D2FE0344A4F -:1000F000507813780021354D7D44354E7E446F5C39 -:10010000BB4202D1775CB8420AD0491C0D29F6D314 -:100110006D200002CBB20D210D2B029D01D116E006 -:10012000029D2C487844405C002809D07F20830041 -:10013000672000021279002A09D0E25A052A06D067 -:10014000880025497944085805F0E0FD80471D499D -:1001500060529321C900615C00290CD0019BE15CD5 -:10016000EF220A40E25409210903884203D05D21AD -:10017000154A01235354615B020A114B5A545A1811 -:100180005070881C605306F06FF803A9884202D1B2 -:100190000D9806F075F803A8808D002809D10FB0DE -:1001A000F0BD03A887850D9806F06AF8102004F0CA -:1001B000A9FE04F0A7FEC0467C180020AA6F00002C -:1001C000E01F00200202000000180020059100003E -:1001D0000E910000F3900000E0900000F0B583B0B5 -:1001E00019480026FF243146224604F06CFE012007 -:1001F00001904002154D02902E5464002E535D264E -:100200001348815D0298285C9322D700EA5D002A9A -:1002100006D0002904D020210843019949026854DE -:10022000295B05F0B9F87F2189006852E85D002854 -:1002300006D00748805D002802D0002005F0E0FFCE -:10024000FFF720FFDBE7C046E01F00207C180020FE -:1002500000180020F0B581B0304C7C44204605F0F9 -:1002600055FD808802F0C7FC204605F04FFD8088D0 -:10027000C0B2264CFF2845D02948784405F046FDF9 -:100280008088FF2108423DD0214804680546A088A7 -:10029000204F7870000A3870E088F870000AB87053 -:1002A000207A387109342046009108F0A5FE0246F4 -:1002B0007A71B81D214604F0F0FD2C682046093003 -:1002C00008F09AFE0546AE1D2734204608F094FE3D -:1002D000F1B27854EE1DF0B23D18204608F08CFEC5 -:1002E00002462846214604F0D8FD09480068273018 -:1002F00008F082FE8019C0B200994900064A5052A7 -:1003000009200403204601B0F0BDC0468569000005 -:10031000181D0020E01F00207C18002022A30000F0 -:1003200002A3000010B51148784405F0EFFC807975 -:10033000FF2149000B4A082353520B4930224A70CF -:1003400001228A700523CB7003230B714A710024AC -:100350008C71CB7110401B2242400A7009200003AF -:1003600010BDC0467C180020E01F002054A20000F1 -:1003700070B5194C7C44204605F0C8FC808802F01A -:100380003AFC204605F0C2FC8088C0B20F4CFF2822 -:1003900019D01248784405F0B9FC8088FF2528421E -:1003A00011D06B2004020A4EB07800280BD10C4803 -:1003B000784405F0ABFC80886900064A012353525B -:1003C000307009200403204670BDC04685690000D6 -:1003D000E01F00207C18002008A20000E8A1000017 -:1003E000CCA1000010B50720C0430A4909790029B3 -:1003F00000D00846C4B267200002F82C09D805488E -:10040000214605F0F1FDFF20400003490C52092070 -:10041000000310BDE01F00207C180020F0B585B05F -:10042000524E3779554D7D44284605F06FFC808843 -:1004300002F0E1FB284605F069FC8088C0B24C4C14 -:10044000042800D98CE0012529468140162001426C -:1004500000D185E00497B1786B2007020020802945 -:100460001CD000297FD1701D00262946324602F09B -:1004700027F83F21C9003F4A50507D208000165484 -:10048000280215543D20C00016543B4816547B20CA -:10049000800016541675D677344E0420F178002962 -:1004A00061D10499091AFF252A46EE32314FB95419 -:1004B0003018401D1F2109017850012002F060FC16 -:1004C00009200203387D08284CD1049535460026C2 -:1004D0003E757D2080003946385CFB340028274675 -:1004E00041D0202468462F463037076044600846D4 -:1004F0002830012103923246334605F083FD08215E -:100500000291284605F070FD322028706E702A1D79 -:10051000384621462346264605F0A0FD3F20C00070 -:10052000144C21582846243002F07BF92846283004 -:1005300021461531029A04F0B0FC1148784405F0C8 -:10054000E5FB69460F604E600830302331462A468D -:1005500005F094FD0498400038212152039F02E0E9 -:10056000274600E01746B8B205B0F0BDE01F0020F6 -:10057000856900007C1800208604000056A1000058 -:1005800040A00000F0B59FB014460E4602AD69468B -:100590000D60012115AF1A463B4602F0C2F908353D -:1005A0004127002E03D1284601F090FD212741224A -:1005B0002046294604F071FC38461FB0F0BD00000B -:1005C000F0B59DB0C44E7E44304605F09FFB857962 -:1005D000BC4CA0780D90304605F098FB2927C05DF3 -:1005E000012635400B95002500282A460AD0A07820 -:1005F00002282A4606D1B448817901220020072921 -:1006000000D002460C92B548784405F07FFBC05DEF -:100610000D9B012B29460DD00C990029294609D1A3 -:100620000028294606D0A84881790020072900D053 -:10063000064631460A910127012B384600D128464B -:100640009321C900A14A515CA14EFE36E2780029EF -:1006500003D0002801D1354630E16B200502A07897 -:10066000022800D92AE1022A11D3032A08D0022A3B -:1006700000D023E197480068406B002807D11DE1B6 -:10068000944800684021405C022800D016E16720B1 -:1006900005022079002800D110E1012B099202D136 -:1006A000601D04F05BFA08900C98002809D060796E -:1006B0008000801DC0B220180121002201F000FF3F -:1006C0001C90874D7D44284605F020FB808802F071 -:1006D00092FA284605F01AFB7D49CD1C8088C0B2ED -:1006E000042800D9EAE00121079181401620014247 -:1006F00000D1E3E005F048FDAA28754D00D0DDE00B -:10070000651D2846394602F0A5F906904120207063 -:10071000671C14AB28460B993A46FFF733FF099B39 -:100720000546012B14D0032B10D1E9B20EAD38468B -:100730002A4602F07EF800206946086022464332CD -:1007400014213223284603F043F843E0022B34D12E -:100750000EA8142104914170002105910170E9B2A5 -:10076000821C38461F46039202F063F8594800681D -:10077000022F17D1049F406B00282CD005F0C6FA39 -:100780000146684607602746433700223846039BE8 -:1007900005F084FB0546E8B201281CD1384608F074 -:1007A0002BFC17E0C088694608600598486022461F -:1007B00043320EA8162196230AE046480068808836 -:1007C00000216A4603C2E9B22246433296233846E4 -:1007D00002F05EF80546422025540B98002801D10E -:1007E00004206070EFB2E5192846433014A9202296 -:1007F00004F053FBFF20400039466331334B19525C -:100800000D98012830D0069800282DD00C9800288B -:1008100047D02425585D002808D0194620311CA84F -:10082000042204F059FB294B00283AD000265E55DB -:10083000184620301CA904221F4604F02EFB1C9BE6 -:100840002046C8300925274A7A44294605F08AF807 -:10085000D020265407984002395C10220A433A54AB -:1008600004F0A8F92D0329E00D95322F354625D83F -:100870002046C830433421463A461C4604F00DFB5E -:10088000C82000210D9A115407984002215C1022C3 -:100890000A4322540898C0B204F06EF909200503F7 -:1008A0000CE0092005030A98002807D007984002A9 -:1008B000195C10220A431A5404F086F9A8B21DB03C -:1008C000F0BDC046E01F0020342100207C1800202D -:1008D00082690000181D0020B69F0000749F000070 -:1008E000B89E0000FC880000B0B569230021852275 -:1008F000002808D0FF2040000C49085A0C49411834 -:100900000B32002001E010461A468BB2094CE2542B -:10091000FF2252008B1C054DAB52491C89B260541A -:1009200099B2202004F038FDB0BDC0467C180020EC -:10093000FEFF0000E01F0020B0B50848084D01216F -:100940002954084800242C52074828180822214618 -:1009500004F0B9FA05482C54B0BDC0467C04000030 -:100960007C1800206E0400007D0400008504000057 -:10097000F0B595B08F20C500BB4F00267E51BB4C13 -:10098000385D022822D0012800D069E1C14D7E5196 -:10099000B748395A002900D14AE1B848385C0122E9 -:1009A000FD281FD27851022139554721090178507D -:1009B000B24838188118AE4C15463A5B521B04F009 -:1009C0006CFA385B401B3853012631E1A84C395B87 -:1009D000092900D22CE1A74BF85CFD22FC2812D893 -:1009E00009221FE0FE282FD0FD2800D038E103297E -:1009F00000D21DE1A848395C9F208000385C0002CD -:100A000008430322CEE7904200D029E10B2900D20F -:100A10000EE19948381800210A4601F02DFD954B4A -:100A2000395B0B221018884200D901E103950B9025 -:100A30000020012691493A18525C401C002A0ED130 -:100A400000240728F7D918E0052900D2F0E09248E1 -:100A5000381800210A4601F033FD0522A2E7791873 -:100A600013AC0822204601F052FF85483818014691 -:100A7000224602F0C9F87F4B3446FD18284601F0A3 -:100A800009FE0790284601F019FC05900A952846B2 -:100A900001F04CFC02907B4800684023C05C0022BF -:100AA0001128114609920492089230D17B208100CE -:100AB00006910A9D2846019301F00EFE08902846F3 -:100AC000069901F041FE09902846069901F041FE81 -:100AD000019B01466B480068C05C112817D1099D35 -:100AE00006910A9801F09CFB05990843002802D062 -:100AF0000699019B0BE0284608990843002C01D178 -:100B00000799084300280699019B00D1A8E05D4899 -:100B10000068C05C11280B9A06911DD01D4601206B -:100B20000021079A002A00D0084604430A9801F0E1 -:100B300077FB05990843012C069B02D1002800D1C0 -:100B40008EE050480068415D0124002011290B9A75 -:100B500000D1044604941946089D09980543002DC8 -:100B60000A981CD000291AD00B460499002919466E -:100B700015D100210C9112917B218C000CAA12AB93 -:100B8000214601F021FE395D1298002901D100288B -:100B900066D0002901D0002862D10B9A06990798E7 -:100BA00000283DD13848385C002839D00B46059CD8 -:100BB0000299214304250320002900D00546234340 -:100BC000002B0BD131483918E8B23818294A80185F -:100BD000142204F081F90B9A002833D03D20C00084 -:100BE000002C1DD0385C00281AD00CAC14220A92BC -:100BF00062700020207025483918A01C04F04DF9BF -:100C000016212046224601F014FEE8B23818194990 -:100C1000401821460A9A04F05FF900280BD00B9A7D -:100C200003983A5001204002395C10220A433A549A -:100C3000304615B0F0BD134800684421405C4007C1 -:100C40000ED50B9A1248395C002909D1012139547B -:100C5000472000013958491E3950002AE8D0A7E63C -:100C6000012004F04FF9C0467C1800207C040000ED -:100C70006E04000082020000830200007A0200007D -:100C80007D040000181D00207602000062020000B2 -:100C900085040000740400007B02000070B59EB063 -:100CA0000C4601AD69460D600126002214AB3146A9 -:100CB00001F037FE0948784405F028F808358179B5 -:100CC0004120314203D1284601F000FA212081B2AF -:100CD0002846224601F0ADFD1EB070BDC69800004A -:100CE000F0B59FB0E04A94786B210E021179002C88 -:100CF00004D0FF2C02D0802C00D09CE10A90DB4B6A -:100D0000DB4F3D20C0000990385C0025002806918B -:100D100012D0F85C00280FD150790125FD21FD2863 -:100D20000AD34A1CD5B205220023A84200D01A4695 -:100D30000325884200D015460BAE304608F0F6F881 -:100D4000B085CC49084208D00BA8002181851598B0 -:100D500005F096FA6F20060249E10BA805F090FA1B -:100D60001590387DC44E092800D03DE10221C843CA -:100D7000801CC0B284423FD1787F002800D11FE19F -:100D80004F20C400385D002800D12DE100255822F5 -:100D90000A98294604F097F8B3494879002800D109 -:100DA0000EE10A9E2336491D2922304604F075F8CB -:100DB000B74839183046FFF771FF3D55B248012555 -:100DC0003D5434463046AC4E294601F0F1FD002832 -:100DD00000D1F5E09320C000385C002800D003E18A -:100DE000A848042139546802395C10220A433A5455 -:100DF000204603F0F3FEE3E00791F5204000089061 -:100E0000385C002813D1E8B206990B1A3446FB3639 -:100E1000002B00DAE8E000216A4611605160924A36 -:100E20001018421D3846283005F0ECF82646787F29 -:100E300000282FD0914C385B069D4119FB367D224E -:100E40009200914200D9CFE038188D494018864968 -:100E5000491D2A4604F021F8385B40193853FFF742 -:100E600087FD002804D001204002385CC006F6D57A -:100E700047200001385800287F4E0BD10120410245 -:100E8000795C1022114205D17E4B0324FC5411439E -:100E9000400239540998385C734A9178002925D06A -:100EA00000280A9C11D120206946486017A80860D4 -:100EB000384694306C494A1D0121069B05F0A2F882 -:100EC00069490998385C002853D00898385C002894 -:100ED00023D020206946486017A808601720000129 -:100EE0003A1838469430012160233FE000280BD1A6 -:100EF0000021684601604160384694305A4A521DCC -:100F0000069B05F07FF8584A012058497854FF2184 -:100F1000490078520020107052E020220392684667 -:100F20001B2109017C18046042603D4628350121DF -:100F30000491002305932846224605F063F82846CD -:100F400005F080F8684622460260039B436028460D -:100F50000A9C04991D4605F055F86846456017A996 -:100F6000016038469430404A0499059B05F04AF8E0 -:100F70003D49787F002829D04348385C002804D1B7 -:100F800000215822204603F09EFF40480068017966 -:100F900061708079A07020464C30082105F024F85B -:100FA000FF2040000799395200202F4908704870EF -:100FB000787F002811D0E01C17A9202203F06DFFD4 -:100FC000159805F05DF90920060334E0FF20400084 -:100FD000079A3A52002048700870E11C17A8202296 -:100FE00001F010FC002829D0159805F049F9FF20E0 -:100FF0004400002038533875204D7A5B204839185A -:10100000194803F04AFF785B385305F02DF90BA916 -:10101000884202D1159805F033F91A480121395454 -:10102000164800243C521B4838180822214603F079 -:101030004AFF19483C54B0B21FB0F0BD0898385C64 -:101040007B218900795C014309983A5C0A20002AD7 -:1010500005D0090603D1012008997854002038757D -:1010600009200603D1E7C046E01F002079020000F6 -:101070007C180020FFFF0000856900006E0400005E -:101080007A0200007C04000076020000181D002097 -:10109000620200007D0400008504000070B541205C -:1010A000C000134D2818FFF71BFE0446012046021E -:1010B000A85DC0061AD50F48295C042904D003296D -:1010C00005D103F019FD04E0012129540EE003F0DD -:1010D000E7FC00280AD1FF20400000212952A85D2A -:1010E000EF220240AA552975D520C401204670BDC3 -:1010F0007C1800207C040000F0B581B009210D03AC -:10110000002800954BD0472007014B4EF0594B4B20 -:10111000F15C022901D1401EF051002828462AD056 -:10112000474830188F21CC0032598118454D735BE8 -:101130009A1A03F0B2FE3059715B081A70530124F9 -:101140006502705DEF2101407155FFF711FC002829 -:1011500002D0705DC006F8D5705DC006009D2846BF -:10116000364B08D503F09CFC002862D10020307576 -:101170003548FB30314BF15C022917D1F259002A76 -:1011800014D103201F46F05403F0B6FC01240028BC -:101190004FD10022F2552C48FB3011461DE0264865 -:1011A000002202752549415C27481CE0032915D11E -:1011B00000217177F5214B00F15C7B229200B45C39 -:1011C0000C433D21C900755C03210A22002D04D087 -:1011D000240602D10122F25400223275FF2252006D -:1011E000B25A1A4BD21893B2040A194DEC54FF2686 -:1011F0007400931C104F3B53521C92B2A854009A97 -:10120000904201D103290FD10C48012139540D48D6 -:1012100000243C520F4838180822214603F053FEA0 -:101220000D483C5470003B5A99B2202004F0B4F8A9 -:101230000024204601B0F0BD7C1800207C04000092 -:101240007A0200006E04000085690000FEFF0000C5 -:10125000E01F00207D04000085040000F0B585B08B -:10126000704D2F79784C7C44204604F04FFD8088E7 -:1012700001F0C1FC204604F049FD6B4EF21C808851 -:10128000C0B2042800D9C9E004970127394681403B -:101290001620014200D1C1E0A878644A7632802845 -:1012A00008D0002800D0B9E03902614B03245C5417 -:1012B00000211975EC788023052C55D8012C53D0CA -:1012C00000286DD1581CC1B200208C4200D00746C6 -:1012D000A01E02905648407F002803930CD1184668 -:1012E0002A30C0B20090019104F04EFF0199009A9B -:1012F0009042324600D091E07B2080004C4A134659 -:101300001F54012000228C4201461F4600D0114686 -:10131000029BDBB2042B034600D3134619433D2343 -:10132000DB00F9547877FA83424909684023CB5CA3 -:1013300041497A540326744002265E402643002E1B -:1013400000D01046FF263246EA32B8541A2B12D883 -:1013500001209840394A10420DD0E878052808D07D -:10136000042808D1012005E0802C19D0812CA7D0B9 -:1013700054E002207854324800243C54F5204000C8 -:101380003C54304838181822214603F09CFDEC36B6 -:10139000BC554F20C00001213954EC78A878039B3C -:1013A000FF273946EC31224E3D22D2009C4229D003 -:1013B000B25C002A26D0725C002A23D1984221D147 -:1013C00028790A38C0B231281CD86879022819D87F -:1013D000012808D1A879382805D1E879322802D126 -:1013E000287A00280ED09320C000305C00280F4AD5 -:1013F00014D1012070544002315C10220A4332544F -:1014000003F00CFCEE370498F0551F200001691D15 -:101410003150022001F0B4FC0920020390B205B063 -:10142000F0BDC046E01F0020826900008A6A00000B -:101430007C180020181D0020860400008001400454 -:10144000870400006202000016930000F0B593B01C -:101450006F4C7C44204604F059FC808801F0CBFBA3 -:10146000204604F053FC8088C0B2604F04283ED868 -:101470000124214681401620014238D05C4E6B2069 -:101480000002B178002902D0F178002930D167201C -:101490000002317907292BD305AD284607F046FD18 -:1014A000A8855449084208D005A8002181850F98D5 -:1014B00004F0E6FE6F2007020EE005A804F0E0FE4F -:1014C0000F904D49087D0A2803D1FB3770790B280E -:1014D00011D30F9804F0D4FE47480021017504F0A1 -:1014E000C3FE05A9884202D10F9804F0C9FE384610 -:1014F00080B213B0F0BD41480818751D2922049030 -:10150000294603F0CAFC707980002043295C281822 -:101510004518681C00222146039200F0D1FF02907A -:101520006E79354D36482E543A48784404F0EEFB37 -:101530008079042108420DD1324800684021415C85 -:10154000022902D0816B00294BD0412EC1D1806B82 -:10155000000206432C48285C00281CD111AF3846F5 -:10156000029901F05EF9381D314601F05AF97B20ED -:101570008000285C002804D011A8082100F02EFE6D -:1015800009E068460399016041602846283011AAA5 -:10159000082304F037FD0021049E304601F05AFA7A -:1015A000002804D00120014600F036F807E0600270 -:1015B000295C10220A432A54304603F01FFB932073 -:1015C000C000285C09210F03002888D00F488168DB -:1015D000491C81604268914281DB5D2101224254B5 -:1015E0007DE7012E2646B5D073E7C0468569000029 -:1015F000E01F0020FFFF00007C1800202B020000ED -:101600005E020000181D0020860400000018002063 -:101610002A91000052900000F0B5B1B0002818D017 -:1016200003910021684601603648374C201827ABEB -:101630000A4601F076F97B208000205C002810D05B -:101640002020694648601FAA0A60412080002018B7 -:101650000EE0FF2043002C4A0020D052692285264C -:101660003CE02020694648601FAA0A6020462830D6 -:101670000121002304F0C6FC04AF384604F0E2FC6C -:101680002025684645601FAE066001243846214685 -:1016900032462B4604F0B6FC1E48784404F036FB74 -:1016A0008079400820406946FF273A4652320A6056 -:1016B000486027A8154C31462A46234601F068FAAF -:1016C00079006278D01C104B58521149595CA2180D -:1016D00091707A21CA430B320026039900290ED15A -:1016E00083B20A4CE254FF225200831C064DAB52D7 -:1016F000401C80B2265499B2202003F04DFE31B038 -:10170000F0BDC0462B0200007C180020E01F002026 -:101710005E020000E28E0000F0B581B06720060294 -:10172000284D287901282AD1284C7C44204604F0F1 -:10173000EDFA808801F05FFA204604F0E7FA80882D -:10174000C0B2214FFF2819D02148784404F0DEFAB6 -:101750008088FF21084211D0FE1E04F015FDAA2842 -:101760000DD16C791B48784404F0D0FA09210903A3 -:101770008088C0B2844205D10E4600E03E46B0B239 -:1017800001B0F0BD3E46FB36082CF8D80091012090 -:10179000A0408B2149000842F1D00F4D7D442846DE -:1017A00004F0B4FA408801F026FA284604F0AEFAB4 -:1017B000408820423E46E2D0204600F08FFC009E4A -:1017C000DDE7C046E01F002085690000528E000062 -:1017D000328E0000168E0000E08D00006D200002A9 -:1017E00070470000F0B58BB009AD002106262846F1 -:1017F000324603F068FB0A200A990143297101244B -:101800002846214601F0F0F902202843214601F044 -:10181000EBF9124F7F44384604F078FA801C2946D1 -:10182000324604F0D3FB6D4620262846314604F0AC -:10183000DBFB384604F06AFA08302946324604F0E9 -:10184000C5FB08AD2C70384604F060FA401C2946F0 -:10185000224604F0BBFB0BB0F0BDC046688D000013 -:10186000F0B581B0017800250091002918D0441C02 -:1018700000270125002620462946324600F020FE9A -:1018800080B2094988420BD00849884207D0241DFC -:101890007F1CF8B2009988423546EAD300E0022561 -:1018A000E8B201B0F0BDC0461DB100001EB100009D -:1018B000F0B59BB0B54A9778802038436B210E0273 -:1018C000802800D034E110790C90D578002F04D115 -:1018D000022D02D3802D00D02AE1D520C401264656 -:1018E000FE3EAA200B9004F04FFCAA2800D01FE176 -:1018F0000FAE304607F01AFBB085A549084208D064 -:101900000FA800218185199804F0BAFC6F20040209 -:10191000FDE00FA804F0B4FC1990002F16D0972119 -:1019200089009C4D695A13225201002900D1ECE034 -:10193000AA5A8A4200D0E8E097482818FFF790FF9B -:10194000002864D000F032F90446E8E0012D2AD8DE -:101950004120C0008F4F381800265822314603F02E -:10196000B2FA8A4B58790B2800D3CDE08B48006837 -:1019700001798B4AB95480798A4978548648381855 -:10198000591D292203F089FA8048024650798100C6 -:101990000120084312185179002D49D0927909028B -:1019A0001143072245E097218F007A4DE95B13220E -:1019B0005601AA5B0C9BD2188A4200D9A5E00024EC -:1019C0006846046044602846283070494A1D0392E6 -:1019D000214604971F4604F015FB684604604460E6 -:1019E000284694302146039A3B4604F00BFB674A95 -:1019F000A85BC019A85314700499695A80B2814237 -:101A000011D1FF204000022129525470BBE0012077 -:101A10004002295C10220A432A54199804F030FC31 -:101A20000920060384E0FF20400001212952AAE09A -:101A3000062297239B00F9528018002964D0089051 -:101A40001320400135460A903D523E46283738461D -:101A5000069304F0F7FA30469430079004F0F2FA57 -:101A60004E4E3068093007F0C7FA11300EAA1070D8 -:101A7000684605604560012338462946099304F00D -:101A8000C1FA36680936304607F0B6FA03466846AA -:101A90000560456038462946324604F0B3FA684688 -:101AA00005604560404A7A4411233E46384629463F -:101AB00004F0A8FA06993748405AFC280F4603D884 -:101AC0000DA90870012307E00DA948700B9A533245 -:101AD0000A70000A8870032330463E460590694626 -:101AE0000D604D600DAA294604F08CFA0C98FB3865 -:101AF0000899401A0EA90870264F0A9AB95AC3B21B -:101B00005818B95B884216D9199804F0B9FB4120DE -:101B1000C000204908180021582203F0D4F904F02D -:101B2000A3FB0FA9884202D1199804F0A9FB26460D -:101B3000B0B21BB0F0BD6846056045602C46134E40 -:101B40000899761805982146324604F05BFA0EADE6 -:101B50002B7868460460446007982146324604F0BA -:101B600051FA0A4E0A9AB85A29784018B852347075 -:101B70000699795A80B28142099901D17470022183 -:101B8000FF204000395209200403C8E7E01F00206D -:101B9000FFFF00007C1800202B020000181D002011 -:101BA000090200000A02000046770000F0B5A3B069 -:101BB000FF204600374F0024BC5305AD284607F0F0 -:101BC000B5F9A8853449084207D005A884850F983F -:101BD00004F056FB6F20040243E005A804F050FB1C -:101BE0000F90202103916846416004961BAE066069 -:101BF000284F28370125384629463246234604F027 -:101C000001FA384604F01EFA68460660039B4360FA -:101C100038462946324604F0F5F9684604601F4804 -:101C20001C49081811AF214622463B4600F079FEB8 -:101C30001C48784404F06AF88079400828406946D6 -:101C400064220A604860164C3846124F3146039AA7 -:101C5000234600F09DFF6078801C0499785209208B -:101C6000040304F001FB05A9884202D10F9804F097 -:101C700007FB4120C00038180021582203F023F947 -:101C800005A8808D002802D1204623B0F0BD03F0C6 -:101C900039F9C0467C180020FFFF00002B0200002D -:101CA000E01F00204A89000070B59320C000094D54 -:101CB000285C002801D0084C09E001204602FFF70B -:101CC000F7FD0446A85DC00601D502F03BFF2046A3 -:101CD00070BDC0467C18002082690000B0B5014686 -:101CE00069228520002902D0FFF760FF020AFF2148 -:101CF0004900074B5C5A074D2A55A21C5A52611CD9 -:101D000089B2685491B2202003F046FBB0BDC046B2 -:101D10007C180020E01F00206D20000270470000AA -:101D2000F0B589B01E4617460A460024E543782AD6 -:101D300000D987E0002A06D00024015D002902D1E5 -:101D4000641C9442F9D30490111B8A2048436421F7 -:101D5000069206F039FE03465A1C306898423FD975 -:101D600001960295002138460092059303F0ABF8E6 -:101D7000059B03940698844226D21946039A049838 -:101D80000792805C491E08911C46395D09020E18B5 -:101D90003D463A273046394606F0A0FE4743F11B40 -:101DA0002F463955393608998C4201D8732E04D301 -:101DB000611E002C0C46E8DC00E02146079A521C0C -:101DC00006988242059BDAD10021039A029D019E6A -:101DD000785C002806D1481C99420146F8D302E0FD -:101DE00032602FE0084600998918091A336831607B -:101DF0008B4227D3131A002B10DB481E0028059BAB -:101E000019DB134878447C181E46BB5DC35C6355E0 -:101E100033465B1E491E0029F5DC0CE08A420AD2DB -:101E20000A49794414463B5CCB5C3B55401C641C1E -:101E300033689C42F7D3074878440178384603F06A -:101E400042F80025284609B0F0BDC0469073000056 -:101E5000AE7300007A730000F0B595B000920F46A3 -:101E600002900AAC2A21204606F024FF02200443F7 -:101E70000594790001400D220A4303924140881DD8 -:101E800001901325002102980491405C06900021E6 -:101E900007200991401A01210891814006980140CC -:101EA0000791ECB2142C0ED81520021B60000AA971 -:101EB0000E183188C81C042900D808463080521EEC -:101EC000B61C002AF5D160000AA9085AFF34072879 -:101ED00000D82C46E0B2132817D814210D1A400060 -:101EE00005990A180AA90E5A138801210027072B01 -:101EF000084600D8384676000E2737400743C843C7 -:101F00001752921C6D1E1E46EED107980028089AA3 -:101F100000D10246149840000E21014011430AA846 -:101F200001850999491C08292546B1D10499491C04 -:101F300008292546A7D100210B460A460C46009EDB -:101F4000D8B240000AAD285A240603D1002801D196 -:101F50000C4604E0D4B230303055521C01245B1CD6 -:101F6000D8B2039D8542EBD81106019D02D13021E4 -:101F70003170012200242146CEB2B5420D4622D94D -:101F8000361876000AAFBE5B6D1C002E04D1EEB28F -:101F9000019FB742F4D816E02506009F04D1D4B2C1 -:101FA0002E253D55521C0124DDB26D000AAE755B35 -:101FB0003035D6B2BD55521C5B1C491CCDB2019EBA -:101FC000AE423546D8D8D0B215B0F0BD80B581212B -:101FD0008900044A525804490968496CFFF73CFFDC -:101FE00080BDC0467C180020181D0020F0B583B0CD -:101FF0002B4D00262B4A2846314602F064FF284626 -:10200000314600F0F1FD28482E529320C0002E5496 -:10201000264801242C54264828180822314602F06C -:1020200052FFFF20EC302E5422482E542248784490 -:1020300003F06CFE4078012801D0FFF7D3FB1F4866 -:10204000784403F063FE4078002807D01C487844A9 -:1020500003F05CFE808800F0CEFD02E0FF2000F07F -:102060003DF81848784403F051FE0078002814D158 -:1020700002AD2C7001AE3470134F7F44384603F02C -:1020800045FE29303146224603F0A0FF384603F0D2 -:102090003DFE2946224603F099FF03B0F0BDC0463D -:1020A0007C1800209C0400006E0400007C040000EA -:1020B0007D040000850400004E8500003C85000082 -:1020C0002E85000018850000028500004021415C3B -:1020D00001220A40022111430170704710B582B0FD -:1020E000014601AC204600F07FFD0548784403F02E -:1020F0000DFE001D0222214603F068FF02B010BD54 -:1021000090840000F0B58DB0074641208000324930 -:102110000D180C46284603F095FF00266846066019 -:10212000466077208000221804232846314603F0B9 -:1021300069FF6846066046601720000122182024C7 -:1021400028463146234603F05DFF68460660466038 -:102150001920000120490A1828463146234603F079 -:1021600051FF0C960B96039708377D2084000CAA2C -:102170000BAB3846214600F0C7F9002828D00B9851 -:102180000C9900266A46166056600B1808332846DC -:102190003146039A03F036FF04AA3846214600F080 -:1021A000DDFA002813D068460660466004AA1A23A8 -:1021B0002846314603F026FF68460660466008233D -:1021C00028463146039A03F01DFF012600E0002651 -:1021D00030460DB0F0BDC0467C180020F0B583B08D -:1021E0000C46054600266846066046604120800091 -:1021F0000A490F181B2000010A18202338463146CF -:1022000003F000FF684606604660384631462A46BD -:10221000234603F0F7FE03B0F0BDC0467C18002053 -:1022200070B504461E4E3068416B002911D01D491F -:1022300079440322204602F04FFE012500282CD0CD -:10224000194979440322204602F046FE002824D092 -:1022500030684021405C13280CD114497944042291 -:10226000204602F039FE002816D11834104979446E -:1022700028220BE00F4979440422204602F02CFE6C -:10228000002809D118340C4979440222204602F072 -:1022900023FE0125002800D00025284670BDC04639 -:1022A000181D00204D6F00003E6F0000276F0000DA -:1022B000196F0000D36E0000C56E0000B0B5044673 -:1022C000154800684021405C132810D11349794417 -:1022D0000322204602F000FE00281AD117341049CC -:1022E00079442722204602F0F7FD01250FE00D4931 -:1022F00079440322204602F0EFFD002809D117346B -:1023000009497944012520462A4602F0E5FD0028C6 -:1023100000D000252846B0BD181D0020856E0000A5 -:10232000766E00005F6E0000506E0000B0B504468F -:102330000C480068406B002810D00B4979440322F8 -:10234000204602F0C9FD0125002808D0074979443C -:102350000322204602F0C0FD002800D000252846B8 -:10236000B0BDC046181D0020416E0000326E000056 -:10237000F0B586B0FF241470046800278C421AD28E -:102380000B9E002B01D000241C60002E01D00024E5 -:10239000346005684C1B012C0DDB05922A46551C48 -:1023A000056014784E2C5FD804954C2C039704D20A -:1023B0002746049D45E03C4659E000274E2C26D098 -:1023C0004D2C0DD04C2CF4D102943746049C0E1B9E -:1023D0000024012E3E464ADB951C056057782FE00D -:1023E00002940196049C0E1B0024022E15463EDB2F -:1023F000009300231C461F46049AD65CE4B2A64014 -:10240000F7195B1C0834022BF7D1ED1C15E0029480 -:102410000196049C0E1B0024042E154627DB009316 -:10242000002423462746049A165DDBB29E40F71926 -:10243000641C0833042CF7D16D1D0560009B019EC0 -:10244000029C491B002915DB04952546B942039CD3 -:102450000DD3002B01D004991960002E2C4600D01A -:1024600037600168C919016005980470012420468D -:1024700006B0F0BD039CFAE7F0B581B000920722E8 -:10248000D34308240029224600D01A46002900D14F -:102490000C4600252946465D7F273740002D3346F0 -:1024A00000D13B46009F002F00D01E46E3B29E4065 -:1024B00071189C186D1C022DEDD1084601B0F0BDBD -:1024C000F0B581B000920722D3430822002900D042 -:1024D0001A461824002900D10C4600252946465DDD -:1024E0007F273740002D334600D13B46009F002F09 -:1024F00000D01E46E3B29E4071189C186D1C042D3E -:10250000EDD1084601B0F0BDF0B5044600201060E2 -:10251000186000291FD02578FD26FC2D01D8012741 -:1025200010E0032917D3B54215D1601C00242646BC -:102530002546075DF6B2B7407D19641C08360327AF -:10254000022CF6D115601F601068C319012000220B -:102550008B4200D91046F0BDF0B585B01446024656 -:102560000020FD26002B029608D0002300291BD056 -:102570001578B54205D201212B4616E00B460146DF -:1025800013E0032910D3B54219460ED1561C00257D -:102590002F462B46715DFFB2B940CB186D1C083732 -:1025A0000321022DF6D100E01946029DAD1C04AEB8 -:1025B000357055180395D2185518002B17D00026E2 -:1025C00037466846066003A804AA29463346FFF743 -:1025D000CFFE00280AD004A80178781CA14200D0C0 -:1025E00038460399A9420746EBD100E0384605B0CA -:1025F000F0BDF0B585B002920027FD22002B08D077 -:10260000002300291BD00478944205D201212346DF -:1026100016E00B46394613E0032910D394421946BD -:102620000ED1441C00252E462B46615DF6B2B1400A -:10263000CB186D1C08360321022DF6D100E0194697 -:10264000921C04AC227042180392C01845180298DC -:102650000128019716DB002B019F13D00B9C0A9ECB -:1026600000276846046003A804AA29463346FFF7FA -:102670007FFE002806D07F1C0298874202DA03986A -:10268000A842EED1012002998F4200D0019805B0F6 -:10269000F0BD000070B501464A78012300246A2A83 -:1026A000184600D020460B4D2D684026AD5D022D0A -:1026B00000D023461843022D0AD16A2A08D00020F0 -:1026C000002A05D18A78012000216A2A00D0084614 -:1026D00070BDC046181D002080B5C12200F002F870 -:1026E00080BD0000F0B581B015460E460746FFF7E5 -:1026F00097FD0024002804D13846FFF7DFFD0028AD -:1027000002D0204601B0F0BD0E4800684021405C78 -:102710007978022807D16A2905D0002907D1B8782D -:102720006A28EED003E06A29EBD00228E9D0012321 -:10273000384631462A46FFF70FFF00240128E0D132 -:102740000446DEE7181D002080B5C222FFF7CAFF4D -:1027500080BD80B5C422FFF7C5FF80BDF0B585B050 -:10276000144600270497039703AA6B465A6004AAED -:102770001A60022201263346FFF73BFF01283D463F -:1027800000D1054604990029304600D1084605408D -:102790000398142800D03E463540002D11D07620F5 -:1027A0006070192020701422E2707720C6433046F2 -:1027B0002130A070201D02F070FB24366676882040 -:1027C0002076284605B0F0BDF0B583B01D4616460C -:1027D0000024002E13D0002D11D06A4616605560DB -:1027E000032201273B46FFF704FF002807D030688B -:1027F000002804D02868002800D107463C4620461F -:1028000003B0F0BD70B50023002A08D00023521E8B -:1028100094B2055D0E5D6E403343002CF7D1D8B203 -:1028200070BD01700A0A42700A0C8270090EC170F4 -:102830007047F0B5A3B0164603AC202522462B46C0 -:1028400003F00CFC0BAF384603F0F0FB1420694694 -:102850000E6048600121384622462B4603F0D2FB29 -:1028600023B0F0BD70B588B014466D4620262A46C8 -:10287000334603F0F3FB284631462A46334603F03D -:10288000EDFB04222046294602F007FB08B070BD8C -:10289000F0B58BB01D4614460346109E022701205A -:1028A000FF2E00D807461198002808D0142038437E -:1028B000C2B202A8194602F0F0FAFFB20EE0FFB26F -:1028C00002A8C2191846FFF7B4FF300A04D002A8C4 -:1028D0004670310A017001E002A8067014213943E4 -:1028E00002AEF21914323046FFF7BCFF01951821F1 -:1028F000394301AB30462246FFF712FA002803DBCA -:1029000001A800880BB0F0BD012002F0FBFA002AFC -:1029100006D0491E8B5C0370521E401C002AF9D160 -:102920007047F0B58DB0174606780B2E3CD201915A -:102930000293002E13D0401C0021182200252B46A4 -:10294000445DD2B29440E3186D1C083A042DF7D1CF -:102950008A0003ACA350491C001DB142EDD102F026 -:10296000BBFE68460760212703AD3846294632463C -:102970002B4603F0EBFB202238462946029C2346D7 -:1029800003F090FB0198002805D012992120012323 -:10299000224603F097FB02F09FFE03A800212022AD -:1029A00002F091FA0DB0F0BD022002F0ABFA000087 -:1029B000F0B58DB0024610780B2843D201260028CE -:1029C0003DD002960191521C0024182500273E4656 -:1029D000D35DEDB2AB409E197F1C083D042FF7D1AB -:1029E000A30003ADEE50641C121D8442EDD10528F6 -:1029F000029E24D10126F207039B53402C2B03D0C7 -:102A0000542B01D0312B1AD110490B681C88002C93 -:102A100006D0049D5540A54202D059888D420ED162 -:102A20006432059991420ADC06990198814206D1E7 -:102A3000074A079B01260021934200D80E463046E4 -:102A40000DB0F0BD022002F05DFAC046181D002056 -:102A500050C30000F0B58DB002461F4803681C88C3 -:102A60000120002C33D01078022801D208462EE035 -:102A7000019102930B282CD2521C00251826002706 -:102A80003B46D15DF6B2B140CB187F1C083E042F07 -:102A9000F7D1A90003AE73506D1C121D8542EDD114 -:102AA0000122D307039858402C280299019D04D095 -:102AB000542802D03128284609D1049D5D40A54202 -:102AC000104604D04A88012000219542CED10DB095 -:102AD000F0BD022002F016FA181D0020F0B585B0F6 -:102AE00004920C4602780B2A4CD22021217001213D -:102AF000002A3DD00499891E0191461C0023012122 -:102B000002920393182000221546B35CC0B28340A2 -:102B10005D19521C0838042AF7D1C9B26018049A0A -:102B2000511A0122D2072B469343184A7A4402F0E5 -:102B300019FF27462046049906F0F6FAC1B2361D61 -:102B4000019A91421BDA002D039B01DB3C4603E016 -:102B500027223C466254401CC1B22F226254411CC1 -:102B6000C8B2002222545B1CD8B2029A9042C8D349 -:102B7000C8B2401E00212154C0B205B0F0BD0320F0 -:102B800002F0C0F9022002F0BDF9C04683660000E1 -:102B9000F0B587B01C4617460591064602F09CFD2D -:102BA0000020069006AD6846C5600C9981604460BF -:102BB00007600D98002801D00A4900E00849032267 -:102BC0003046059B03F08EFA2878C00703D02078A2 -:102BD00001210143217002F07FFD07B0F0BDC04626 -:102BE00001040000010600000A020A43FF21090255 -:102BF00051400180704780B5FF218143000A814226 -:102C000001D003F0D9F980BDF0B5002307241E469A -:102C1000155D0F5DF619751905550126FF2D00D8B4 -:102C20001E46671E002C3C46F2D101200021FF2DDC -:102C300000D80846F0BDF0B581B000260724009604 -:102C4000155D0F5D330604D0AF4204D97F1E00230B -:102C500003E0009B01E0FF373346BFB27E1B065501 -:102C60000126AF4200D31E46631E002C1C46E7D14E -:102C7000F0B201B0F0BD000070B582B0044601268C -:102C80003002114D285C30420DD01F2000012A581F -:102C9000002168460160416028462830234603F041 -:102CA000B1F93002285C80070BD51F2000012A589B -:102CB000002168460160416094352846234603F0B0 -:102CC000A1F902B070BDC0467C180020F0B581B0FB -:102CD000FF26EE36294DA85D002848D01F200701A9 -:102CE000E8590478FC2C05D801252846FFF7C4FFD5 -:102CF000FF2031E0FE2C19D0FD2C3BD10120FFF745 -:102D0000BBFFE859411CE951A95DFF31A955C9B282 -:102D100001292CD941780091847802252846FFF7B3 -:102D2000ABFF240200980443FE2015E00120FFF7CA -:102D3000A3FFE859401CE851A95DFF31A955C9B26C -:102D4000032914D900210A46FFF7BAFB04460425DB -:102D50002846FFF791FFFC2008490A46D159491936 -:102D6000D151915D40189055204601B0F0BD012031 -:102D700002F0C8F8022002F0C5F8C0467C18002016 -:102D8000F0B5BFB00646EA48784402F0BFFF857947 -:102D900033AC204606F0CAF8A085ED0801273D4077 -:102DA00084B2002C01D000F067FC33A803F068FA6D -:102DB0003D90002D199700D119951B951DA8C01D98 -:102DC000189025A8011D169128301790F2481C96DE -:102DD0001A9707466CE2072800D069E23C69002C8C -:102DE00000D163E2FF25EE35785D002801D100F0C7 -:102DF00032FC844200D30446002CE74F01D100F09E -:102E00002AFCE0B2FFF738FF1F20000139580919EA -:102E10003950785D001B78553869001B386147E2EE -:102E20004E783446083CE1B2302901D900F021FC4B -:102E3000B11C1191C9B2884201D200F01AFCD748E6 -:102E4000784402F063FFD449149D49596A4656609C -:102E500025AB059313608A1C08302021234603F01C -:102E60000DF9CD4840598019811F08220598FFF7B8 -:102E7000C9FC002800D0FCE3C74D149EA8593D2191 -:102E8000C9006A5C002A0DD03A22825C3223C25407 -:102E9000A859401DA851EA5DF332EA55695C012248 -:102EA00000293DD1811C25AE3046224601F0F5FFB8 -:102EB0003078322800D0DCE3B7480546149EAC5980 -:102EC0001698A8512420FFF7D7FE11996018A85131 -:102ED000E85D401AE8552F461DA808221799FFF70C -:102EE00016FD002001460246189E735C7C18257F63 -:102EF0005219D31823770122FF2B00D80246491E0E -:102F00000C460834F1D10125FF2B00D885E0B0E351 -:102F10003D20C000A049085C0022002800D1A8E3A1 -:102F2000139201263046FFF7A7FE9B4D149968586F -:102F3000421C6A50E85DFF30E855C0B2232800D833 -:102F400097E3F5204000285C002826D034022E5557 -:102F50002420FFF791FE00200C942855149C295939 -:102F600024312951E85DDC30E855C0B2072800D88B -:102F70007FE30F20400128180822039201F08DFF03 -:102F80000398FFF779FE0C982E54285908302851E1 -:102F9000E85DF830E855139D3FE000216846016088 -:102FA00041601720000128182424234603F02AF842 -:102FB0002046FFF761FE1498295824312950E85D16 -:102FC000DC30E855C0B2072800D852E31DA808221B -:102FD000FFF79DFC002001460246189B5B5C6E4C8F -:102FE0006418257F5219D3182377FF2B324600D857 -:102FF0000246491E0C460834EFD1FF2B139D00D921 -:1030000037E30820FFF738FE63480146149A8858D2 -:1030100008308850C85DF830C8553D20C0005E4A71 -:10302000105C002802D10120010250541C9E159C06 -:10303000FFF74CFE584F3861022171403D22D2000B -:10304000BB5C2B430B430022002B214600D01146D2 -:1030500000281A9A00D104460C4054401B980028BE -:1030600002D1002C00D104E302203875FF252C4644 -:10307000EE34385D002800D1EDE2396901291A9B50 -:1030800020D11F200601B859007801210022AE2866 -:1030900000D11146199A1143012906D101210022BC -:1030A000AE2800D111465940F9770120FFF7E4FD21 -:1030B000B859401CB851385DFF3038553969491E40 -:1030C00039611C9E002917D04D1EC0B2854200D325 -:1030D0000546002D304F00D1BDE2E8B2FFF7CCFD30 -:1030E0001F200001395849193950385D401B3855A7 -:1030F0003869401B3861DBE0022E1FD13D21C90039 -:10310000795C002916D0F5214900795C002915D099 -:1031100000216846016041600F2040013A1838469E -:103120002830082302F06EFFEE35785D06E0C046D9 -:10313000F47700000121090203227A54C0B2032867 -:1031400000D896E2F52040003D21C900795C0029B5 -:103150000ED0385C00280BD11F2000013A58002106 -:1031600068460160416038462830042302F04AFF77 -:103170000420FFF781FD1F2000013958091D395037 -:10318000385DFC30385501203875B868401EB8608D -:10319000F868401CF8608BE07C1800203C77000049 -:1031A000F5204200B95C3D25E800385C00284FD08E -:1031B00000294DD120266846466025A90991016065 -:1031C000172000013C180B9401210491002308935F -:1031D00020460F92099F3A460E9502F013FF2046B3 -:1031E00002F030FF6846076046602046049D29468D -:1031F0003A46334602F006FF684646601DAF076058 -:10320000ED4C2834204629463A46089B02F0FAFE47 -:10321000204602F017FF68460760466020462946B0 -:103220003A46334602F0EEFE0B980999324601F019 -:1032300034FE19200001E04908183946DE4F3246B5 -:103240001C9E01F02AFE0F98395C0E98C000385C75 -:10325000002822D0002920D0D848385C00280BD183 -:1032600000216846016041601B2000013A18384681 -:103270002830202302F0C6FE0A20387518E0052801 -:1032800016D1FF24EE34385D002800D1E3E13D691A -:10329000002D00D01AE7042076E7092139750028AF -:1032A00006D03846283002F0CDFE01E008203875FF -:1032B000397D00E03975C8B2042807DC02286EDDCC -:1032C00003282AD00428F3D1B86836E0062800DDA8 -:1032D000BBE1D4D1FF242546EE35785D002800D12E -:1032E000B9E1032800D8C4E10420FFF7C5FC1F2082 -:1032F0000001E74F3958091D3950785DFC30785589 -:1033000008212042D6D00124250200207855FFF75D -:10331000DDFC7C5538610721CCE7022E00D13FE768 -:10332000FF20EE30385C002800D194E1FFF7CEFC9E -:103330000021B860F9600421397506210028B9D050 -:10334000FF24EE34385D002800D184E1072800D83E -:103350008FE1012ECE4F11D13F20C0003858F968BF -:1033600081420BD11F200001395838461530082200 -:1033700001F093FD7D208000012139540820FFF7E2 -:103380007BFC1F200001395808313950385DF83076 -:103390003855FFF79BFC38610520387571E7002828 -:1033A00006D0012802D0022882D15FE6B868E0E0AA -:1033B0000026BE60FE603E61384615300822314668 -:1033C00001F081FD3D462835284602F03BFE3C4693 -:1033D0009434204602F036FE3D20C000385C0028C0 -:1033E0003AD0012000023E54F5204000385C00280D -:1033F0002DD0684606604660772080003A18042386 -:103400002846314602F0FEFD6846066046601720F9 -:1034100000013A1807922020069028463146069B64 -:1034200002F0F0FD684606604660192000013A1877 -:1034300028463146069B02F0E5FD68460660466078 -:10344000602320463146079A02F0DCFD04E0172095 -:103450000001381802F0F6FDFF261096EE36B85D32 -:10346000032800D805E11F20050179597720800045 -:103470001290381804240A90224601F00EFD2046CE -:10348000FFF7FAFB7859001D0D957851B85DFC30B7 -:10349000B8558049795C002917D0C0B2032800D8FC -:1034A000E7E07B4F0D9D79599120C0003818042426 -:1034B000224601F0F2FC2046FFF7DEFB7859001DA2 -:1034C0007851B85DFC30B8551FE073480068402162 -:1034D000405C16280A9C18D8012181406F4801429F -:1034E00013D0002120460A46FEF7EAFF00280CDA36 -:1034F000002120460A46FEF7E3FF6949884204DBC3 -:103500001099EE316248405CC7E763480068442187 -:10351000415C890718D5007A022806D0042813D107 -:103520005B481299405C01280ED8594CA05D0328D5 -:1035300000D89EE00420FFF79FFB0D996058001D06 -:103540006050A05DFC30A055FFF7C0FB504FB86045 -:103550009321C9001C9E022E524A08D1795C002991 -:1035600005D05168002900D150600021116001216F -:10357000397500281DD03846FF27EE37C05D00287A -:1035800069D00124022E1BD0012E254600D04FE524 -:1035900023286ED92420FFF76FFB1F2000013C4930 -:1035A0000A46115824311150D05DDC30D055012528 -:1035B0003EE5032038757BE67C1800208604000079 -:1035C000012856D91F210A011492314989580A78D5 -:1035D000022A159400D19BE4012A00D120E4002A9C -:1035E00047D13D20C0002A49085C002841D12E4C1B -:1035F0007C44204602F08AFB8088FFF7FCFA2046D4 -:1036000002F084FB8088C0B2042806D0022804D0CF -:1036100001282ED11B9800282BD01D4C149D6059D9 -:10362000401C6051E05D401EE055C0B2232820D907 -:103630002420FFF721FB605924306051E05DDC302D -:10364000E0550120A0770025E7E401460839032969 -:1036500001D3FFF7C0FB02F007FE33A9884202D175 -:103660003D9802F00DFE33A8808D00280DD13FB0AB -:10367000F0BD012001F046FC33A8002585853D986A -:1036800002F0FEFD02480575204601F03BFCC046F5 -:103690007C18002086040000181D002080014000D6 -:1036A00003000080001800208C6F0000F0B581B08E -:1036B00000900B09012213405B42194C1C40CD08BD -:1036C00015406D42174E2E404701774067404C0928 -:1036D000144064421448204078408E0916407642D7 -:1036E000124F37404740C80910404042104A02403C -:1036F0007A4098272F40009DED0E49012943C9B219 -:10370000794079251D404D40F32121406940AE2389 -:1037100033404B401E2101405940104601B0F0BDDE -:10372000E2996DB7618EBCF2C4B35F3EA8E2AB2EE6 -:1037300070E4434FF0B581B015460E4607463C781D -:10374000012000210090FFF7B1FF002C12D07F1C58 -:103750001F22224042403C781046FFF7A7FF7F1C03 -:10376000002CF5D106E0FFF7A1FF0246307850406B -:103770006D1E761C002DF6D10824FFF797FF641EFE -:10378000FBD1009A504001B0F0BD000070B5144666 -:103790000A4601460D487844FFF7CCFF2322054630 -:1037A000D54020239E1A0B46B3402B431646203E9D -:1037B0000D46F540002E00DA1D461F232B402370D6 -:1037C000531F641C002A1A46E9D170BDC25A00007A -:1037D000F0B599B01D460346002017901690107062 -:1037E00014296FD11E990020002904D0012969D124 -:1037F0000192082000E001920CAF3870781C14226E -:10380000194601F04AFB15210026324630463B7826 -:1038100000021843134608337F1C491E0224E44368 -:10382000A2420EDB0D3213460A3B0446DC401F2346 -:10383000234002ACA355521F761C092AF3DC521F09 -:1038400000E01A460029E2D1002A019F07D0052195 -:10385000891A88401F21014002A88155761C02A8C0 -:1038600016AA3146FFF792FF0020002E394611D0EC -:1038700002A801780023144A7A44202920D2581C37 -:10388000AB421DD202ACE45C145DFC54B042034672 -:10389000F3D3391800220D4B7B4416AC2478202C2E -:1038A0000ED28418641CAC420AD816ACA45C1C5D11 -:1038B0008C54521C082AF0D300238B54801801E04A -:1038C0000020387019B0F0BDEC590000CC59000050 -:1038D00070B594B014460A46014601A8FCF7ADFB4A -:1038E00001460020002912D001A8027800216B4671 -:1038F0001960011D21250CAE2846334602F026FC36 -:10390000202228463146234602F0CCFB012014B089 -:1039100070BDF0B59DB0144613AAFFF7D9FF00257E -:10392000002811D021266F4613AA012530463946BA -:103930002B4602F0C7FB08373846FEF7C7FB204688 -:103940003946324601F0A9FA28461DB0F0BD000004 -:10395000F0B58BB00746119C012F17D0129E032F94 -:1039600012D1212205AF084611463A46FEF761FF03 -:103970000025684605601421384622463346FFF785 -:1039800027FF002836D136E0022F25D10393049477 -:1039900005A81425457000240470861C21220846C1 -:1039A00011463246FEF745FF022F0DD1109900292E -:1039B00008D06846056000220498334602F06EFA8B -:1039C000002817D1002516E06846039912C005A803 -:1039D00016219623049D09E025460024684614C05C -:1039E0000648301883B22122084611462A46FEF7BF -:1039F0004FFF2C54012528460BB0F0BDFFFF0000FF -:103A000070B59AB00E4604462069002500282AD0D9 -:103A1000217BA068401CFF31C9B211AA00252B46AA -:103A2000FFF777FF00281ED0F388B288A0680078DF -:103A3000716B33256E46B56004AD22C611A9FFF740 -:103A400087FF002500280ED0246904AD284605F024 -:103A5000D3FA421C2846214605F042F901250021EF -:103A6000002800D00D4628461AB070BDF0B585B0CC -:103A70000A4606460020B07334460E34317B0829CE -:103A800027D803AF002101910825384602922A4623 -:103A900001F019FA327BA81A3818B16801F0FDF963 -:103AA000029D2735284605F0A7FAC6B220462946CA -:103AB000324601F0F2F92020A055A019421C0298CC -:103AC000416C3846FEF7C8F930182018019941704A -:103AD000012005B0F0BD000070B598B004466D46F9 -:103AE0006021284605F0E6F8A16928461C304022EE -:103AF00005F0E4FA5C20295C0020002917D1227B24 -:103B0000082A14D8267D082E11D86D46A81A14301C -:103B1000A16805F0D5F8A81B1C302169324605F0D4 -:103B2000CFF804486022294605F0CAF8012018B0F1 -:103B300070BDC0460018002010B50C490860FEF7A3 -:103B400055FA9320C0000A4901240C5401F014FBDB -:103B50002102084805F0AEF8002003F0F1FF2046EE -:103B600003F0EEFFFCF73AFB10BDC046181D002025 -:103B70007C1800201C1D002080B506480078002815 -:103B800001D104F07DFE044979440020024604F08E -:103B9000E3F980BD1C1D00205C5C000080B582B094 -:103BA00001900648784402F0B1F8293001A90122B9 -:103BB00002F00CFAFFF7E0FF02B080BDD869000008 -:103BC00001460020022903D8880002497944085898 -:103BD0007047C046745B000080B5012805D00028FE -:103BE00007D10020FFF7DAFF80BD0120FFF7D6FFE5 -:103BF00080BD002003497944034A7A4404F03AFE28 -:103C000080BDC046130000002700000001460020D0 -:103C1000012903D888000249794408587047C046F2 -:103C2000345B000080B5002802D0FFF7A5FF80BDFF -:103C30000648784402F06AF82921435C00200449D0 -:103C40007944044A7A4404F0F7FD80BD4A690000D3 -:103C50007DFFFFFF91FFFFFF80B5002003497944FE -:103C6000034A7A4404F006FE80BDC046ABFFFFFF66 -:103C7000BFFFFFFF80B5FF2002F0C2FA80BD80B514 -:103C80000120FEF72BF8FFF777FF80BD80B50020FD -:103C9000FEF724F8FFF770FF80BD80B50120FDF727 -:103CA0002BFA002800D080BDFFF766FF80BD80B5ED -:103CB0000020FDF721FA002800D080BDFFF75CFF4F -:103CC00080BD80B50120FDF717FA002800D080BD27 -:103CD000FFF752FF80BD80B50020FDF70DFA0028E8 -:103CE00000D080BDFFF748FF80BD80B50120FDF703 -:103CF00003FA002800D080BDFFF73EFF80BD80B5ED -:103D00000020FCF7F1FDFFF737FF80BD80B50120F3 -:103D1000FCF7EAFDFFF730FF80BD80B50020FCF71F -:103D2000E3FDFFF729FF80BD80B50120FCF7DCFD36 -:103D3000FFF722FF80BD80B50020FCF7D5FDFFF71F -:103D40001BFF80BD80B50120FCF7CEFDFFF714FFFF -:103D500080BD80B50020FCF7C7FDFFF70DFF80BDDB -:103D600080B50020FCF7C0FDFFF706FF80BD80B5E1 -:103D70000120FCF7B9FDFFF7FFFE80BD80B50020F4 -:103D80000146FDF749FCFFF7F7FE80BD80B5012035 -:103D90000021FDF741FCFFF7EFFE80BD80B500205C -:103DA000FCF7A2FDFFF7E8FE80BD80B50120FCF71F -:103DB0009BFDFFF7E1FE80BD80B50178490601D08B -:103DC00001F050FA80BD0000B0B50546072028403C -:103DD0000024012814D0022814D1002909D00B484E -:103DE00002F01AFA68B200280ADA02F0E5F80024B4 -:103DF00006E0FF2152310548002202F025FA044670 -:103E00002046B0BD022001F07DF8C046E01F002032 -:103E1000F0B581B0E04D28780C2810DD0D286CD06D -:103E20000E2800D1C7E015280FD1DC488079012881 -:103E30000BD1A879000708D4102001F063F80528F9 -:103E400000D111E10C2800D181E2D54C0027676038 -:103E500001202070204602F0A3F9042002F01CFA91 -:103E60006060692800D05DE101F0A0F901F0A0F9DF -:103E7000BE25F84E7753042002F00EFA6060002849 -:103E800000D164E2972800D161E2C02430590028B3 -:103E900000D15CE2705BAA27C421715C80B28842C9 -:103EA00000D354E202F0C4F9002800D04FE202F03F -:103EB00041F9B84204D102F067F9B84200D046E2B5 -:103EC0003059715B49014018CC217158002902D04A -:103ED000884700280AD0012803D13059715B490175 -:103EE00040180178490601D001F0BCF9705B401C14 -:103EF000705331590029CFD129E2D54C0027676092 -:103F000001202070204602F04BF9042002F0C4F991 -:103F10006060002800D11AE2972800D117E26928D2 -:103F200000D099E101F042F901F042F9BE25C94EF5 -:103F30007753042002F0B0F96060002800D106E257 -:103F4000972800D103E2C0243059002800D1FEE1B7 -:103F5000705BAA27C421715C80B2884200D3F6E16D -:103F600002F066F9002800D0F1E102F0E3F8B8426F -:103F700004D102F009F9B84200D0E8E13059715B90 -:103F800049014018CC217158002902D088470028E7 -:103F90000AD0012803D13059715B490140180178DA -:103FA000490601D001F05EF9705B401C7053315935 -:103FB0000029CFD1CBE1EA4D00276F6001202870A6 -:103FC000284602F0EDF8042002F066F904466C6021 -:103FD000692C00D0E6E001F0E9F801F0E9F8BE2430 -:103FE000E04E3753042002F057F96860002800D1F2 -:103FF000ADE1972800D1AAE1C0257059002800D171 -:10400000A5E1305BAA27C421715C80B2884200D34D -:104010009DE102F00DF9002800D098E102F08AF845 -:10402000B84204D102F0B0F8B84200D08FE1705924 -:10403000315B49014018CC217158002902D08847D2 -:1040400000280AD0012803D17059315B490140187A -:104050000178490601D001F005F9305B401C30536E -:1040600071590029CFD172E1BD4C00276760012052 -:104070002070204602F094F8042002F00DF96060F0 -:10408000002800D163E1972800D160E1692800D0C1 -:1040900018E101F08BF801F08BF8BE25B14E775393 -:1040A000042002F0F9F86060002800D14FE1972861 -:1040B00000D14CE1C0243059002800D147E1705BA9 -:1040C000AA27C421715C80B2884200D33FE102F08C -:1040D000AFF8002800D03AE102F02CF8B84204D141 -:1040E00002F052F8B84200D031E13059715B490119 -:1040F0004018CC217158002902D0884700280AD0E6 -:10410000012803D13059715B4901401801784906F3 -:1041100001D001F0A7F8705B401C705331590029A1 -:10412000CFD114E1C0258F4C6059002800D106E1A1 -:10413000BE26A05BAA27C421615C80B2884200D35E -:10414000FDE002F075F8002800D0F8E001F0F2FF81 -:10415000B84204D102F018F8B84200D0EFE060593C -:10416000A15B49014018CC216158002902D0884741 -:1041700000280AD0012803D16059A15B49014018E9 -:104180000178490601D001F06DF8A05B401CA053F6 -:1041900061590029CFD1D2E01C1E0020342100201B -:1041A000481F0020D8206F4D2958002911D06422C3 -:1041B00064290B4600D31346CA1A2A50D421002A78 -:1041C00007D16958002904D0DC22AA582A500020BF -:1041D0008847002C00D1BAE0972C00D1B7E0C0246A -:1041E000285900282FD0BE26A85BAA27C421695CC5 -:1041F00080B2884227D202F01BF8002823D101F0B8 -:1042000099FFB84203D101F0BFFFB8421BD1285932 -:10421000A95B49014018CC216958002902D0884780 -:1042200000280AD0012803D12859A95B4901401868 -:104230000178490601D001F015F8A85B401CA8538D -:1042400029590029D2D1C420285CBE21695A7AE0BC -:10425000481F00201C1D0020C025424C605900282A -:104260006DD0BE26A05BAA27C421615C80B28842C3 -:1042700065D201F0DDFF002861D101F05BFFB8429B -:1042800003D101F081FFB84259D16059A15B4901C6 -:104290004018CC216158002902D0884700280AD054 -:1042A000012803D16059A15B4901401801784906F2 -:1042B00001D000F0D7FFA05B401CA053615900293A -:1042C000D2D13CE0D020274C2058002803D0E978F8 -:1042D000490801F00BF8C025605900282FD0BE26F0 -:1042E000A05BAA27C421615C80B2884227D201F07A -:1042F0009FFF002823D101F01DFFB84203D101F038 -:1043000043FFB8421BD16059A15B49014018CC2141 -:104310006158002902D0884700280AD0012803D11B -:104320006059A15B490140180178490601D000F0AD -:1043300099FFA05B401CA05361590029D2D1C42031 -:10434000205CBE21615A814201D301F071FF01F06E -:104350006FFF002801D100F0DDFD012001B0F0BDAC -:10436000481F00201C1D0020B0B582B019481A4D0E -:104370002A18294615316846FEF75DFC00240028FE -:1043800025D1164914316846082204F0A9FC0028FA -:104390001DD100206877F5214A003D21C9006B5CE2 -:1043A0000A21002B05D0AB5C002B02D10121A954BE -:1043B0000021092212030A4BEA52FF225200022373 -:1043C000AB522975074990220A7048700124204693 -:1043D00002B0B0BD7D0400007C1800200018002051 -:1043E00002020000E01F0020F0B583B02A4EB07F2B -:1043F00000280BD0294C204655302B497944072200 -:1044000000F04BFD5C20002121543FE0244832188D -:104410003146153101A8FEF70EFC224F3D680028F9 -:104420000DD04020285C082833D11C4C2046553044 -:104430001E497944062200F030FD5B3424E0273524 -:10444000284604F0D9FD0246144C5534204629462E -:1044500000F023FD3D682735284604F0CDFD2021DE -:104460002154284604F0C8FD2018401C81218900F1 -:10447000705001A8FDF7AAFD05463868273004F002 -:10448000BBFD28182018441C00202070012003B018 -:10449000F0BD0020FBE7C0467C180020001800207B -:1044A0007D040000181D0020895200005B520000AE -:1044B000F0B5A5B01E4614460F460546FEF7EAF8CD -:1044C000002807D0A74979440A22204604F0F8FBC7 -:1044D00025B0F0BD0494A14800684024005D112877 -:1044E00044D128463946FEF734F903909B480068CA -:1044F000005D11283AD128463946FEF7EDF800282C -:1045000012D07B208000039C002C07D09449085CCB -:10451000002803D0083D2846FDF7F4FD002C049840 -:104520007ED0924979447DE08C480068005D112876 -:104530001CD128463946FEF707F9002816D07B2003 -:1045400080000399002907D08549085C002803D022 -:1045500028460838FDF7D6FD2C78FD2C7F4F64D116 -:104560006878A97809020143C81C5FE02846FDF776 -:10457000DDFE002810D079480068406B0028A7D0E5 -:1045800001F0C4FB0146A8786A461060EB1C0022CB -:10459000049801F083FC9BE7704F3868C488284674 -:1045A000FDF73EFE0321002802D0386884880421EC -:1045B000200A04D005AA54701070022702E005A852 -:1045C0000470012705A8C0196918142503902A460C -:1045D00000F063FCFF20EA306149085C002810D03D -:1045E0005E480068C28801200021944200D008463D -:1045F0006946086014210398049A3346FFF7E8F8E7 -:1046000066E7012069460C6048602F43B9B2B3B237 -:1046100005A8049C2246FEF73BF90021215457E7E8 -:104620005149794404F0E0FC52E7601C291815391F -:1046300020AE1422304604F043FB307800281CD012 -:10464000002020A94E4A7A440B781C09145D05AD60 -:104650002C542C180F251D40535D6370491C801C81 -:104660002928F1D3282005AB002119544121454ABE -:104670007A44049801F076F92AE703200121FD2C01 -:1046800000D00846295C4018295C4118039800288E -:104690000CD0685C0818401C295C00290AD04C2901 -:1046A00009D1291849784018801C04E0681840781E -:1046B000891C09E0401C291849784018801C295C95 -:1046C0000818401C295C491C08182A5C411C4C2A0B -:1046D00000D001466C186078A17809020143E078A7 -:1046E000227912020243100408431F901FA8204998 -:1046F0007944042204F0AEFC00280DD01FA81E4906 -:104700007944042204F0A6FC002800D0E0E61B490E -:1047100079440B220498D9E63D68287919AE3070A7 -:1047200021461131701C15273A4604F0C9FAA888B1 -:1047300001216A4603C205AD5023304639462A4658 -:10474000FEF7A6F8002129544420205C6946086041 -:104750004121084A7A4404982B468BE7181D002013 -:104760007C180020C65900008350000070510000E2 -:10477000BF4F0000604F0000CF4F0000885700007F -:104780008E50000075500000F0B597B001AD502478 -:104790002846214604F08EFA4548464F391815A898 -:1047A0000822FEF7B4F8444838187B2189002A46CD -:1047B0002346FFF77DFE414E40223046294604F055 -:1047C0007DFCA1208000385C142811D13C483818A9 -:1047D00040497944042200F07FFB002808D1394881 -:1047E00038183D497944042200F076FB00282FD088 -:1047F000354C374626682736304604F0FDFB024626 -:104800003D4641352846314600F047FB26682736AD -:10481000304604F0F1FB2021295430463E4604F096 -:10482000EBFB2818401C81218900224A505015A812 -:10483000FDF7CCFB05462068273004F0DDFB281887 -:10484000401C3018412100224254012017B0F0BD15 -:104850001E48381801210022FDF732FE034630467B -:1048600041301F2B06D0032B07D0012B0BD11B4946 -:10487000794404E01A49794401E01A49794406224E -:1048800004F01EFA04E01421174A7A4401F06AF891 -:1048900035464135284604F0AFFBC4B228198121C2 -:1048A000890078500A483818FDF790FB2018C8E7AF -:1048B0007A0200007C18002082020000001800200C -:1048C0008502000089020000181D00208D020000F2 -:1048D00091020000244F0000BF5600008B4E0000E4 -:1048E0008B4E00008B4E0000834E000070B58CB0E4 -:1048F00020206946486004AE0E600C4894300C4D90 -:104900002A46413201240023214601F07BFB684600 -:10491000082306601836436086604121054A7A44C0 -:10492000284601F01FF820460CB070BD7C1800200E -:1049300000180020FE4D0000F0B59BB007A85021E4 -:1049400004F0B8F94F4F39680020002959D1009080 -:104950004E4C0120029038604B482118264605AC89 -:104960000825204601912A46FDF7D1FF39460C3132 -:1049700020462A4604F0B4F9002841D144483018B2 -:104980007B21890007AD50232A46FFF791FD394668 -:104990001C31284604F0E4FA0028344630D13D4862 -:1049A000205C022808D14720000121584A1E2250CD -:1049B00002230121002A30D08F20C50063590198BD -:1049C000C118354A1646A25BD21A00F066FA605941 -:1049D000A15B081AA053029E7502605DEF210140A1 -:1049E0006155FBF7C5FF002804D001204002205C80 -:1049F000C006F6D5605DC00605D538680028A8D089 -:104A000000981BB0F0BD472000012158002000296C -:104A100000D006461F48235C3146022B19D10029DD -:104A200017D003201B4960541C4822182146153119 -:104A300003A8FEF700F9002807D1143703A80822BD -:104A4000394604F04DF9002801D00020D9E711487B -:104A5000235C0120032BD4D100206077F520410096 -:104A60003D20C000225C0A20002A05D0625C002A9A -:104A700002D10120605400202075FBF75DFF01206A -:104A8000BFE7C046001800207A0200007C18002012 -:104A9000820200007C0400006E0400007D0400001F -:104AA00010B59320C0000F4C205C002802D0FFF707 -:104AB00043FF10BDFFF768FE4720000120580A4958 -:104AC0006158491C0B1A094855301421084A7A4488 -:104AD00000F048FF074979440020024603F03CFA01 -:104AE000012010BD7C180020740400000018002074 -:104AF0005A4C0000824E000010B59320C0000E4CAE -:104B0000205C002802D0FFF72FFC10BDFFF76CFCE3 -:104B10000146002000290ED07B208000205C002868 -:104B200002D00649794401E0054979440020024653 -:104B300003F012FA012010BD7C1800202C4F000059 -:104B4000124F000080B5FFF7D1FE034979440020E1 -:104B5000024603F001FA80BD4C4D000010B504463A -:104B600004497A22FDF7BAFF00212046FDF720FF15 -:104B700010BDC04600180020B0B504460A4DC83527 -:104B8000284604F039FA20212954291800204870B9 -:104B9000002C02D00649794401E0044979440246D8 -:104BA00003F0DAF9B0BDC046E01F0020E84F000076 -:104BB000CA4F000080B5034979440020024603F043 -:104BC000CBF980BD4050000080B5034979440020F6 -:104BD000024603F0C1F980BD9C50000080B5054934 -:104BE0007A22FDF77BFF044979440020024603F056 -:104BF000B3F980BD001800202451000080B505499C -:104C00007A22FDF76BFF044979440020024603F045 -:104C1000A3F980BD00180020B051000080B5034901 -:104C200079440020024603F097F980BD54520000F9 -:104C300010B58CB06C46204604F078F9A0850D497B -:104C4000084206D1684601F01BFB0A90FF2001F0E4 -:104C5000D7FA01F009FB6946884202D10A9801F0AF -:104C60000FFB6846808D002801D10CB010BD00F00C -:104C700049F9C046FFFF0000F0B59FB00446002C84 -:104C80002FD10DAC002648222046314600F01BF9FA -:104C9000032525720D9633480E902046093034497D -:104CA00079440526324604F00BF820461730314F80 -:104CB0007F443946324604F003F82046273039460F -:104CC000324603F0FDFF26462D362B497944304607 -:104CD0002A4603F0F5FF4020112121541A960420A2 -:104CE0001E9021480460214C01200102204603F05F -:104CF000E1FF01AD284604F019F9A88585B2002D21 -:104D00000BD001A8002181850B9801F0B9FA0B980E -:104D100001F0B6FA102DE7D01FE001AD284601F0F2 -:104D2000AFFA0B9000F028FAFDF760F9002002F0CE -:104D300007FF012002F004FFFEF71EFFFBF74EFA0B -:104D400001F092FAA84202D10B9801F099FA01A859 -:104D5000808D0028C8D000F0D5F8FFF769FF1FB09C -:104D6000F0BDC04678006E00181D00201C1D0020FC -:104D7000934A0000884A0000714A0000F0B59FB0D5 -:104D80000446A068002831D10DAD002748222846EE -:104D9000394600F098F80320009028720D973748A4 -:104DA0000E90284609303749794405273A4603F0E2 -:104DB00087FF28461730344E7E4431463A4603F08A -:104DC0007FFF2846273031463A4603F079FF2E46CA -:104DD0002D362E4979443046009A03F071FF402069 -:104DE000112129541A9604201E90A5600027244EF4 -:104DF00001AD284604F09AF8A885304207D101A8F1 -:104E000001F03EFA0B90F8070FD001F0D5F901F050 -:104E10002BFA01A9884202D10B9801F031FA01A8BE -:104E2000808D002828D10127E2E70A2001F0B8F898 -:104E30006068022817D004280BD00328E5D1E06869 -:104E400000218161A168E068FEF7DAFDE168886110 -:104E5000DBE7E0680021C162A168E068FEF706FEBA -:104E6000E168C862D1E7E068FEF736FE0028CCD0E2 -:104E7000A068FEF761FEC8E700F044F878006E0015 -:104E8000FFFF00008B4900008049000069490000D5 -:104E900080B5002001F0F4F980BDB0B5884208D992 -:104EA000002A0FD0491E401E8B5C8354521EFBD13A -:104EB00008E0002A06D000239CB20D5D05555B1C5E -:104EC000521EF9D1B0BD80B50B46002A03D0114661 -:104ED0001A4603F0FDFE80BDB0B50023002A0FD0B6 -:104EE000401E491E8C5C855C521EA54202D1002AE0 -:104EF000F8D105E00020C0430123A54200D80346B5 -:104F0000D8B2B0BD10B5044601F0AEF9214604F0A8 -:104F100019F8000080B501F08BF9002800D080BDA1 -:104F20000648002141706022027002228270C17026 -:104F30000171052101F070F980BDC0461C1E0020E2 -:104F4000B0B51A48C078032807DC01280DD0022824 -:104F500028D1174802F073F9B0BD04281FD00828E3 -:104F600020D1134802F069F9B0BD114C012120464F -:104F700002F05EF9204602F03DF90E4CA0790028BF -:104F800011D120460C30002504222946FFF79BFF53 -:104F90001034082220462946FFF795FFB0BD04488B -:104FA00002F049F9B0BD1020FFF7ACFF1C1E002035 -:104FB000F4210020342100207F210140002003291A -:104FC00003D8C8B201490818007B7047342100207B -:104FD00080B516480179042918D0022906D0012984 -:104FE00022D1811D134802F00DF880BDC2787F21C7 -:104FF0001140032918D8C9B24A000D4B9A18002352 -:105000001382821D0B4802F082F880BDC2787F2196 -:105010001140032908D8C9B2054A521843791373BD -:10502000821D044802F01CF880BDC0461C1E0020F2 -:1050300034210020F421002070B515460E460446A8 -:10504000FF2D1BD80E4850210170202101714571A0 -:10505000E91C817080222243C270090A4170062136 -:1050600001F0DAF83046294601F0D6F87F202040DA -:105070004000044908187D210901018270BDC04625 -:105080001C1E00203421002080B50A4601468220E3 -:105090001423FFF7D1FF80BD80B50A460146832067 -:1050A0001423FFF7C9FF80BD80B50C4801780029A3 -:1050B00000D080BD062181710A21017008498B78DA -:1050C0004A7812021A43FF232A339A4200D31A461F -:1050D0004280C91C0348FFF7E0FE80BD3421002058 -:1050E0001C1E0020E01F0020B0B5204882784178C7 -:1050F0000902114300780F280ADC0E2810D00F286F -:1051000023D10020012927D1FFF71AFF0120B0BDCC -:1051100010281ED0162818D1FFF7C6FF0120B0BDF9 -:1051200013488168643181601621124A435A002B6A -:1051300008D06424642B1D4600D325465B1B4352D4 -:1051400013420ED0891E0E29F0D10220FEF760FE18 -:10515000B0BD0020032900D2B0BDFFF739FF012008 -:10516000B0BD002101701020FFF7CCFE1C1E0020F6 -:1051700034210020FFFF0000B0B50A2000F010FF2E -:10518000084C0025182220462946FFF79CFE658022 -:105190002570A571A56000F061FB034805604560BE -:1051A000B0BDC046342100204C21002070470000D3 -:1051B00002480021016041607047C0464C21002038 -:1051C000F0B589B00546084600F0A0FD0446002C65 -:1051D00043D02069002840D0284600F097FD0146C2 -:1051E00002AD1C2228460192FFF757FE2168E98094 -:1051F00062682A81A0681A4F65233B7089B292B217 -:105200004A434243D1084E1C07231A4200D10E469E -:10521000314600910426864070181D30B870000A8F -:1052200078700321384600F0F7FF2846019900F016 -:10523000F3FFA06838700121384600F0EDFFE06808 -:1052400000F064FDB1B200F0E7FF009885B220697C -:1052500000F05CFD294600F0DFFF09B0F0BDC0465C -:105260001C1E002070B500F051FD044620787F26FA -:10527000064000F0DDFF002830D1002E2ED0E0697E -:1052800000281DD000F042FD0546052E02D1A07E6B -:10529000002824D0284603F0AFFE064612486521B8 -:1052A000017031461C318170090A4170032100F000 -:1052B000B3FF1C21204600F0AFFFB1B228460BE03F -:1052C000094800214170652101701C25857003216A -:1052D00000F0A2FF2046294600F09EFF70BD204648 -:1052E0002946FFF76DFF70BD1C1E002070B50446F7 -:1052F000002C28D01448066845688E4201D16D1CE8 -:1053000045600E43002902D00660324605E00022C7 -:10531000026042600D4B5B1C1E438A4201D000219B -:105320004160082D0CD30321284603F0D3FB012252 -:1053300090073043002900D03046D107884300E071 -:1053400030462946A04770BD4C210020FFFFFF7F5B -:10535000F0B581B00F4E01243470B11CFF275037D7 -:105360007A1C204600F03EFF054675707A1B7719BF -:10537000F91C022000F036FFB8702D187619F47071 -:1053800000F024FF3071902070710020B071E81D92 -:1053900001B0F0BDE01F0020F0B58BB00A46064614 -:1053A00007210E4207D03346D8B291B2FEF70CFD6A -:1053B00080B20BB0F0BD4B20840083200390AA4D37 -:1053C000A84F3346019109E06920A9490870039864 -:1053D000801C487002220199079B2DE11021304664 -:1053E0000840049292B20592002A069600D1B5E0D8 -:1053F000002800D0B2E007930091029007E0A1B22C -:105400000022384600F020FF012000F03FF900F0B4 -:105410000FFF0028F3D17D200001A9680E1828781D -:105420000928079A42DC072848D0092863D10021BF -:105430008E48079101F0F8FB10E0FFF76BFDA1B279 -:105440000022384600F000FFA868B04200D3FEE01A -:10545000FFF74AFE00F0ECFE0028F0D1834801F08F -:1054600039F90028E9D0059AD01D4008A92800D3B1 -:10547000F3E003980D307E4B9854981807994170CB -:10548000581D0499891C8AB205921946FFF705FD3B -:10549000052277480799FFF716FD0598401D83B24E -:1054A00072480399724A01F0D3FB3FE00A2804993D -:1054B0000AD00B2822D17148784401E06E48784424 -:1054C000059900F035FA31E02046253080B2059E7E -:1054D000864200D9C1E053203870B970080A78704C -:1054E0000321384600F098FE6148314600F094FEF2 -:1054F000002028701DE0002800D1ABE0D0B2059953 -:10550000FEF762FC002811D0A4E0FFF703FDA1B272 -:105510000022384600F098FEA868B04200D396E01A -:10552000FFF7E2FD00F084FE0028F0D12878002883 -:10553000EBD10020A87128706880069EB10600D5C6 -:1055400036E7FFF7E7FC30060298009906D5089188 -:1055500008AA484B1846114601DF0298002804D1DA -:1055600070066ED40020A87128700020688000F0BA -:105570005FFE002801D1FFF7CDFCA1B20022384622 -:10558000079200F061FE022806D8B9787A781202F4 -:105590000A43D11C81423DD1FFF7A6FD68882978D6 -:1055A0000029E4D00028E2D0354979440422304E65 -:1055B0003046FFF791FC00282ED03249794404226E -:1055C0003046FFF789FC00282BD02F49794404226C -:1055D0003046FFF781FC002837D103982730C6B248 -:1055E00000F0D2FDB04200D0EEE60120204E307037 -:1055F000B01C402100F0BAFD7070811C184A121DC9 -:105600001140039B0D337354C11C1140002373548C -:10561000021D10E00020A7E7FFF79AFE02460023D4 -:1056200009E00020707003980D30307080200699DA -:10563000014302220B460199DEB20B4200D1CDE6B6 -:10564000B2E6688806494018B2E66888B0E61020DD -:10565000FFF758FC0920FFF755FC0220FFF752FC2A -:10566000FBFF00001C1E00203421002054210020DC -:10567000E01F0020BE9A0060C7FBFFFFDDFBFFFFBD -:10568000FE480000F1480000E648000070B50446FE -:1056900000F0CEFD002801D1FFF73CFC4B2081003B -:1056A0000B4E002530462A4600F0CEFD30781528F6 -:1056B00006D8012181400748014201D0002C05D1C4 -:1056C000FFF712FD0125002800D10546284670BDD0 -:1056D0001C1E00202070200010B5FFF71BFC084C9A -:1056E0004B2081000022204600F0AEFD20780E28DD -:1056F00001D0FFF7F9FC00F09BFD0028F0D110BDB0 -:105700001C1E0020F0B581B000920F4604464B4E9F -:10571000B74210D0494D0021402628463246FFF7B7 -:10572000D2FB00984028024600D33246284639462C -:10573000FFF7B3FB414EB07801280ADC002828D0DF -:10574000012869D1F01C042100F04EFC40213046B4 -:105750002BE0022827D005285ED13079F1780902A4 -:105760000143374C2068002781425BD12068002824 -:105770001ED03448009D2918334A13686D1FADB2FE -:10578000AB4200D21168051D0D4030480068711D04 -:1057900034E0F01C002704223946FFF794FB402137 -:1057A0003046A0473EE025484021A047002739E089 -:1057B000B0797179090201432548016001684908FF -:1057C000A8292FD801682048016071783278120228 -:1057D0000A4320490A601D491F4A0A60009D691F4B -:1057E0008AB218495218D21C0368ED1FADB2AB4201 -:1057F00000D202680D1D1540F11D17482A46FFF71B -:105800004CFB11480168491B0160104801684919A7 -:1058100001602068401C20600B48016801200227BD -:10582000002907D1064800210160084801600648A8 -:1058300001603846C0B201B0F0BDC04698210020DA -:10584000D8210020FBFF0000E0210020E4210020FF -:10585000DC210020E8210020E01F00200348002177 -:10586000016003480160034801607047D8210020AF -:10587000E4210020E0210020F0B581B0264F3A68F5 -:10588000264C2168002921D0002A1FD00090264DE7 -:10589000002140222846FFF716FB0520A870234868 -:1058A0000168090A2970006868701D490868000AC3 -:1058B000E870086828710968206800290ED03B2626 -:1058C0003B2800D826683968681D12E0144800217A -:1058D000016039601348017021601BE039263928C6 -:1058E00000D826682068000A68712068A8713968A5 -:1058F000E81D3246FFF7D1FA009A09492068801B5B -:1059000020603868801938600868401C08600648C4 -:105910004021904701B0F0BDE4210020E0210020AB -:10592000D82100203421002098210020E8210020E7 -:1059300080B500290BD0064A00231360054A116088 -:10594000054A064B1360064A1160FFF795FF80BDBC -:10595000D8210020E0210020E4210020E01F0020C9 -:10596000DC21002081B0F0B58EB015460C460690C3 -:105970001393022C00D2BAE10698002800D1B6E1B8 -:10598000002D00D1B3E10698214603F093F913A846 -:1059900009902978002900D1A9E1671E002602E0BC -:1059A000A8194178761CC8B2002801D02528F7D163 -:1059B000BE4200D33E46069C20462946324603F0AE -:1059C00083F9BF1BA4190694002F00D18FE1A95DB4 -:1059D000AD19252900D087E16B1C002020210A2267 -:1059E00008920490059007900446084604E009993F -:1059F0000A1D0992096804911D46224629786D1CEA -:105A000000242D29F9D0472918DC2F2926DD0B4643 -:105A1000303B0A2B00D366E13029044600D10C4606 -:105A2000079B002B00D004460A23079843435818CD -:105A3000303807902B4620461446DDE7672904DD01 -:105A4000722921DD73293AD122E062293CDC482900 -:105A50004BD1014601200590084617E0252958D072 -:105A60002A2926D02E2900D03DE129782A2900D0E4 -:105A70003AE16A786B1C01242A21482AB7D0682AA7 -:105A8000B5D0732AB3D02FE1682936D110210891FF -:105A900009990B1D0993032313400968012B00D1B9 -:105AA000BBE0022B00D1BAE0032B2B461446A3D057 -:105AB000C6E02978022473292B4698D014E1752971 -:105AC00029D078291CD00EE1632900D19BE06429FC -:105AD00000D008E1029003970998011D0991006820 -:105AE000C11742184A40C00F1CE0582900D0FAE004 -:105AF000014601200590084602E0702900D0F2E03E -:105B0000029003970998011D09910268002010274F -:105B100009E025207BE0029003970998011D099177 -:105B2000026800200A27012497420892049012D8A4 -:105B3000012638460446394602F046FFB04209D1F4 -:105B4000384660430799491E0791089988422646BE -:105B5000F0D900E034460798411E049B002B00D189 -:105B600007990026F243002B029800D11A460192B1 -:105B7000C2B2302A06D1002B04D00AA82D2303700C -:105B800000230126881E0D280BD80AA83043491E81 -:105B9000049303F09DF8049B07988019019940181D -:105BA000461E002B03D00AA82D218155761C05988E -:105BB000002C1AD0002802D05348784401E0514804 -:105BC000784407900898214602F0FEFE394602F01C -:105BD00081FF0798405C0AA988552046394602F0A3 -:105BE000F3FE761CA7420446ECD9039FBE4200D3C5 -:105BF0003E460AA9069C2046324603F065F8BF1BC4 -:105C0000A41906946DE00998011D09910068069990 -:105C100008707F1E491C069163E0049E16E0087818 -:105C2000002860D10499B94200D339462022069C4D -:105C30002046049103F04CF804983F1A24183DE0E4 -:105C400000228B5C521C002BFBD1561E089810289A -:105C50002AD1002E47D000243B46085D0F22024087 -:105C60000009022B1F4642D3059B002B05D0012BB8 -:105C70000ED10794224B7B4402E007941F4B7B44D8 -:105C8000D2B29A5C069C6270C0B2185C2070079C0D -:105C90003846871E02282AD0641C0698801C06906D -:105CA000B4423B46D9D30DE0BE4200D33E46069CEB -:105CB0002046324603F008F8BF1BA4190694002FB3 -:105CC000079C14D0B4420ED9A41BBC4200D33C465E -:105CD0002022069E3046214602F0FAFF3F1B36196D -:105CE0000696002F03D02978002900D056E6002020 -:105CF0000EB0F0BC02BC01B00847C04639420000FB -:105D000051420000F74200000D43000080B50449F5 -:105D1000884204D30349884201D200F005F880BDCF -:105D20000000D0C0C0A5D0C07A460249C91C891A5B -:105D3000401A7047295DD0C010B54101104A0A4091 -:105D4000430E01210B405B420E4C1C405440820E1E -:105D50000A4052420C4B13406340C20E0A4052426A -:105D60000A4C14405C40020F0A405242084B134058 -:105D70006340400F0840414206480840584010BD6B -:105D8000E0FFFF3FB2576A3B6D8E5026FA19A11E05 -:105D9000DD33423DB362142AF0B587B00593049217 -:105DA000064602910D7800270120002D03971BD095 -:105DB0000298401C0690012000272C46019721469E -:105DC0004139E2B2202A5FD3C9B21A295CD3FFF766 -:105DD000B3FF01460698C25DE020044060094840D8 -:105DE0007F1C002A1446EAD10599C919C91D5A29F0 -:105DF00003994CD8FFF7A0FF002D0ED002994C1C40 -:105E0000FFF79AFF014635701F2028404840611C6B -:105E1000761C2578002D0C46F2D131213170711C91 -:105E200006910599002914D000241A4E7E4403944B -:105E300004990F5D1F2F29D8F55DFFF77DFF0699A7 -:105E40000D557840641C05998C42F1D306990919C7 -:105E500006910624FFF770FF641EFBD10121484024 -:105E600019220D497944069B0446D4401F2525403C -:105E70004C5D1C70541F5B1C002A2246F4D100208C -:105E800006998871012102E0019900E00399084612 -:105E900007B0F0BD3834000000340000F0B595B014 -:105EA0000C46054600200390102A1EDC1A99002A91 -:105EB00003D08E1E262E04D917E0142901D02029E4 -:105EC00013D104AE327001206A46082782C21060E6 -:105ED000701C03A9052200F00AF80398431C0393E1 -:105EE000284621463246FFF757FF15B0F0BDF0B502 -:105EF00087B00493019105461046012383405C1E40 -:105F000000270E9900910D9902910C9A002A3E46A5 -:105F100027D04142059100263746029976188F40D6 -:105F200004990B781F43491C0491521E0392864228 -:105F3000069712DB01990B68024620465C1C0C6038 -:105F4000059CA4192F46069DE540044610462540B1 -:105F5000FD543D46361A8642EDDA039A002A069F22 -:105F6000DBD1009900290CD0002E13D001990B68C9 -:105F7000024620465C1C0C60911B8F400740EF548A -:105F800008E0811B8F40274000210298864202DAF8 -:105F9000002F00D10121084607B0F0BD01DF704796 -:105FA00080B584B00190034801A9FFF7F7FF04B062 -:105FB00080BDC0463701006080B582B002486946A6 -:105FC000FFF7ECFF02B080BD3C02006080B586B0F8 -:105FD000019002910392034801A9FFF7DFFF06B089 -:105FE00080BDC0467F03006080B584B00090019101 -:105FF00003486946FFF7D2FF019804B080BDC04650 -:106000002C05006080B588B0009001910292039346 -:106010000A9804900B98059003486946FFF7BEFF65 -:10602000019808B080BDC0463B07006080B584B0D1 -:106030000190034801A9FFF7B1FF029804B080BDA9 -:106040007F08006080B584B00190034801A9FFF784 -:10605000A5FF029804B080BDDB0A006080B586B061 -:10606000009001910292039303486946FFF796FF5F -:10607000019806B080BDC0462C0B006080B588B08A -:1060800000900191029203930A9804900B98059056 -:1060900003486946FFF782FF019808B080BDC046FB -:1060A0002B1A006080B586B0009001910292039394 -:1060B00003486946FFF772FF019806B080BDC046ED -:1060C000EA2E006080B586B00090019102920393A1 -:1060D00003486946FFF762FF019806B080BDC046DD -:1060E0002E2F006080B58AB0009001910292039338 -:1060F0000C9804900D9805900E9806900F980790B4 -:1061000003486946FFF74AFF01980AB080BDC046C0 -:10611000F338006080B586B0019002910392044884 -:1061200001A9FFF73BFF029880B206B080BDC046D0 -:106130006E92006080B582B003486946FFF72EFF7B -:106140000198C0B202B080BD4F9F006080B588B09A -:1061500001900291039204930A980590024801A9C4 -:10616000FFF71CFF08B080BDBA53006080B584B053 -:106170000090019103486946FFF710FF019804B0B1 -:1061800080BDC046FCA8006080B582B00348694667 -:10619000FFF704FF0198C0B202B080BD3CA00060D0 -:1061A00080B584B00190034801A9FFF7F7FE02987B -:1061B00004B080BD5864006080B582B00248694672 -:1061C000FFF7ECFE02B080BD8D68006080B582B044 -:1061D00003486946FFF7E2FE019802B080BDC04661 -:1061E0006E6A006080B586B0019002910392034808 -:1061F00001A9FFF7D3FE029806B080BDD4740060F9 -:1062000080B584B00190034801A9FFF7C7FE04B030 -:1062100080BDC046BE9A006080B584B000900191F8 -:1062200002486946FFF7BAFE04B080BD8183006072 -:1062300080B582B003486946FFF7B0FE019802B00E -:1062400080BDC046BB84006080B586B001900291DD -:106250000392044801A9FFF7A1FE029880B206B09C -:1062600080BDC046E485006080B582B003486946C1 -:10627000FFF794FE019802B080BDC046B187006070 -:1062800080B584B00190034801A9FFF787FE02980A -:1062900004B080BD7588006080B584B0019004486A -:1062A00001A9FFF77BFE0298C0B204B080BDC046D2 -:1062B0008B9C0060F0B585B03A4A1278002A03D072 -:1062C00083213A4A7A440BE00A9A452A03D883216B -:1062D000374A7A4404E0072907D18321354A7A44B2 -:1062E000022300F0B5FC05B0F0BD01920290402001 -:1062F0000393185C0490002822D004980528039D7D -:1063000008D1284641302C4979440522FEF7E4FDA6 -:10631000002833D041350027284E7E44049C0321B9 -:10632000384602F051FB0221C9434143705C297891 -:1063300041402970641E761C6D1C7F1C002CEED120 -:1063400045200399085C4630019A904210D14131B2 -:106350001548049C2246FEF7A0FD072011498871CC -:106360004C80092008700121029800F05DFCBAE71A -:106370008321134A7A4402230298B2E70A4D03228A -:106380002A70681C0F497944FEF787FD281D0E49C5 -:1063900079440422FEF781FD2878431D8321029869 -:1063A0002A469EE734210020E01F0020153C000013 -:1063B000093C0000FF3B0000D73B0000CB3B000046 -:1063C0007A3B00005F3B0000593B0000F0B581B014 -:1063D0001D460E460446284600F016FC00280ED046 -:1063E0002068C11C090A6A469170811C090C517011 -:1063F000411C090E1170001D2060D07004E0684639 -:1064000004222946FEF749FD174F08223846314637 -:10641000FEF743FD3846083069460422FEF73DFD8D -:1064200000207873022139730121B973F87338742D -:10643000284600F0E9FB0146201D8625002906D0EC -:1064400029467931C9B20422FEF73DFD03E06946D1 -:106450000422FEF722FD044A11232046294600F0BB -:10646000F7FB01B0F0BDC046E01F0020F0B583B0DF -:10647000029088794B791F020743887801904B7806 -:106480000E781546093DACB2A74204D0D01FD21FEA -:1064900092B297421BD13D46002E08D083211C4A60 -:1064A0007A440223029800F0D3FB03B0F0BD022B24 -:1064B00018DC012B23D0022B1DD1A8B26A46106034 -:1064C000CB1D002202980199FFF7F4FEEDE7E4B23C -:1064D000A742E1D0D2B297420546DDD083210D4AD2 -:1064E0007A44DEE7032B0ED0C12B04D183210A4A64 -:1064F0007A440423D6E783210A4A7A44D1E78321E8 -:10650000064A7A44CDE78321054A7A440823C9E73D -:106510005C3A0000FB390000083A0000D539000061 -:10652000E6390000043A000080B5C1698A784B78EA -:106530001B0213430A78812A09D0832A0CD0862AA9 -:106540000ED1C91C031D0022FFF740FF80BDCA1CED -:10655000812100F07DFB80BDC91C1A46FFF786FF34 -:1065600080BD000070B50D460146012A11D1094CCD -:1065700020462A46FEF791FC60194026721B002532 -:106580002946FEF7A0FC8120214632462B46FEF725 -:1065900053FD70BD982100200282C1600022C2829A -:1065A000827642858284C16102627047F0B583B011 -:1065B0000D4604462A20215C20462A3001294AD073 -:1065C00000293BD12B210022625423462B33202764 -:1065D000E15DC91EC9B22646203601293ED8218B6D -:1065E000E28A91423CD94020012D00D038460290E9 -:1065F000A07E03230126002800D033460027012D6A -:106600003E4600D12E46B60033431E46029B9B1BDE -:10661000891A1A46914200DC0A4691190291012D0D -:1066200008D1211D2A48042701923A46FEF735FC7D -:10663000019AA07E002820D0FF302BE02521615C4C -:10664000062908D12B21625C0023635423462B3397 -:10665000002A03D1BBE72B200021215403B0F0BD59 -:10666000FCD10021A176E18219700170B180316006 -:10667000E068E06115480170F0E74020205CB9B2A5 -:10668000134B58540120384381B2637E104F7B5422 -:10669000471C207EB9B20E4B5854E169002907D03F -:1066A0001746BAB29819E38AC918FEF7F6FB3A46BC -:1066B000E08A1018E082A07E401CA076029881B289 -:1066C00003482A46FFF74EFFC8E7C04634210020A2 -:1066D0009821002001462A200A5C0120002A10D0BF -:1066E000012A01D100200CE025200A5C0020062AA6 -:1066F00007D12B200A5C01200021002A01D0084686 -:1067000070477047B0B52B2101244454011D0B4D37 -:1067100004222846FEF7C1FB0020687183202871FF -:106720000220A8716920E8717C20C043801C287277 -:10673000092128462246FFF715FFB0BD9821002009 -:10674000B0B52B2101244454011D084D04222846D4 -:10675000FEF7A3FB0020687188212971A871072129 -:1067600028462246FFF7FEFEB0BDC0469821002015 -:10677000F0B581B004462520205C2646253600254C -:1067800005286AD008784B781B0203438878CD78B7 -:106790002D02054328041843237965792D021D43F2 -:1067A000A379E7793F021F433B042B43834257D130 -:1067B00008790B1D658C002D13D02423E75C23463C -:1067C0002433B8424CD1278B401C18707B1B501FC0 -:1067D000984200DB18464219628482B2208D491D1E -:1067E00023E07C25ED436D1DEFB28325B84204D133 -:1067F0002046FFF7A5FF01252FE08F79497909028F -:106800003943C91CA8422BD1208B8DB2A84227D175 -:1068100089B2164D24270020E055121F8A4200DB62 -:106820000A466284154019462A46FFF773FC208504 -:10683000218B628C01258A420FD3E18C88420FD1D3 -:1068400006203070002060842A20205C012804D1BA -:106850002046FFF757FF00203070284601B0F0BDFA -:10686000052030701020FEF74DFBC046FFFF0000F2 -:10687000F0B589B0044623722020205C26462036DD -:1068800003280AD02A25675D25462A35002F1BD00C -:106890002046FFF76DFF002814D1D748062101726A -:1068A000042131707A21C9433A314022A154083081 -:1068B000E0610020A076E08201202083217A20463A -:1068C000FFF774FE09B0F0BD042809D12B20002782 -:1068D0002754A776E7822F70B7803760E068E061C1 -:1068E00008910020012B00D118468700012039466D -:1068F0000143079191423BD80390012B06930492E8 -:10690000059707D1201D04220899FEF7C6FA059FB6 -:10691000049A069BE08A00280CD0012B24D1204643 -:106920001230211D0422FEF7D7FA059F049A069B18 -:10693000002819D0032138460843904218D8009106 -:106940000899C8190290C8570F467A21C9437A316D -:1069500049B28525884225DDA7480421017231709E -:106960003A3540216554A2E702203843904202D9CB -:10697000A148852193E72120205C984246D13078B8 -:10698000012851D1012B7FD1211D042208980392A7 -:10699000FEF7A2FA059F002876D0974806210172DB -:1069A00003997EE70195012B14D1307801281ED17F -:1069B000251D2146123104222846FEF78DFA069B3A -:1069C000002807D0029800780199491CC9B2884272 -:1069D00000D0E8E03078012809D1012B00D080E018 -:1069E000029800780199491CC9B2884279D1079967 -:1069F00078184078795C0F020743208AC01E8742CE -:106A00001FDD7D480099017204216DE07A20C043AA -:106A100001460831784A1172042131703A30402120 -:106A200060540832E26144E7012B56D12B2000214B -:106A30002154A176E1822970B1803160E068E06183 -:106A400040E702980078812805D08628019D51D022 -:106A5000832800D097E0012B57D1251D6749794441 -:106A6000042228460892FEF737FA002807D0644926 -:106A7000794404222846FEF72FFA002845D15E48C3 -:106A80000B21017208992FE0089AD119D05DA27EDE -:106A9000904222D10498079A851AE08A228B121A12 -:106AA000954200DB1546AFB2E2691018491C3A4620 -:106AB000FEF7F3F90699012908D1E08AE16909187E -:106AC000E08C3A46FFF726FB0699E084E08A281816 -:106AD000E082A07E401CA0763CE047480421017281 -:106AE000DFE64548042101723170019A3A324021B3 -:106AF0006254DCE6012B6AD1201D42497944042509 -:106B00002A46FEF7E9F9002870D004980599451A3D -:106B1000FF1CBD4200DB3D46AAB2E0690299089223 -:106B2000FEF7BBF9069B012B06D1E1690020089A0C -:106B3000FFF7F0FA069BE084212023542783E582A7 -:106B40000020A07620461230211D04221D46FEF7AB -:106B5000A4F92946E08A012901D1218B06E0218B85 -:106B6000CA1C824202D22448032198E6884204D2F9 -:106B70000020606301203070A4E6022030702046BF -:106B8000FFF7D2FC9EE61C48039B03720421317080 -:106B9000019A3A32402162540830E0610020A07628 -:106BA000E08223838AE6144C042220462946FEF71D -:106BB00074F90020607101983A302071039AA27133 -:106BC0000620E07108212046FFF7CCFC7AE60A484F -:106BD000039A0272042131703A354021655408301D -:106BE000E0610020A076E082228367E602480B2164 -:106BF0000172357079E7C04698210020A234000068 -:106C0000943400000834000080B506497944042219 -:106C1000FEF762F9014601200022002900D010464B -:106C200080BDC046F432000080B52A22835C024653 -:106C30002A32002906D0002B08D101211170FFF75C -:106C400061FD80BD012B01D10220107080BD0000CC -:106C500070B504462A20205C002809D0012824D0E1 -:106C60002520205C062820D12B20205C00281CD168 -:106C7000202003252554402021540020A076E261E5 -:106C8000E08223832120215C2546213503290DD173 -:106C9000084E3078002808D0032100E029782046EB -:106CA000FFF784FC30780028F8D170BD2046FFF74C -:106CB0007DFC70BD3421002002490020086002499B -:106CC00008607047F0210020EC21002010B5074833 -:106CD000002444704F210170012181700221C17094 -:106CE0000421FFF799FA204610BDC0461C1E002063 -:106CF00070B582B06D4600246C704F262E70022055 -:106D0000A8700320E8702C7105212846FFF784FA4B -:106D10006C702E700120A870E87004212846FFF7DF -:106D20007BFA204602B070BD10B582B001A80024E5 -:106D300044704F210170012181700221C170042132 -:106D4000FFF76AFA204602B010BD0000B0B582B06D -:106D5000144800240460144804606D464F202870D5 -:106D60006C700520A8700420E870012028716971FA -:106D7000AC71012A05DC002A0AD0012A0AD10420BC -:106D800006E0022A03D0032A04D1022000E00320F7 -:106D9000694688716846C3710821FFF73DFA0020F3 -:106DA00002B0B0BDF0210020EC21002010B582B06F -:106DB0006846002444704F2202700522827004222B -:106DC000C2700122027141718471C4710821FFF700 -:106DD00023FA204602B010BDB0B582B00D46684619 -:106DE000002444705021017003218170C57040213E -:106DF000017144710621FFF70FFA8020054201D08E -:106E0000074800E0054801687F2215400122AA409A -:106E10000A430260204602B0B0BDC046F021002007 -:106E2000EC21002070B582B00D4668460024447005 -:106E30005021017003218170C57080260671447154 -:106E40000621FFF7E9F9354201D0074800E005487F -:106E500001687F2215400122AA409143016020462B -:106E600002B070BDF0210020EC2100208020014202 -:106E700001D0064800E0044802787F20014001204C -:106E8000884010407047C046F0210020EC210020CF -:106E900010B582B06846002444704F22027002226E -:106EA00082700322C27001710521FFF7B5F92046F7 -:106EB00002B010BDB0B582B01C46154668465022DF -:106EC0000270C170202101714471E11C8170090AB6 -:106ED00041700621FFF7A0F928462146FFF79CF9EB -:106EE000002002B0B0BD10B582B0684600244470E6 -:106EF0005023037003238370C170302101714271EC -:106F00000621FFF789F9204602B010BD70B515467D -:106F10000E4604460220002C0FD0D421204601F05A -:106F2000C9FE002E01D0B02026509C200121215402 -:106F300025702046FFF7C0FE0020C0B270BDB0B57E -:106F400004469C2001212154B4256059002806D014 -:106F50004068FEF7DBFE024621792046904708355F -:106F6000CC2DF2D12046FFF7DFFE2046FFF7AEFE24 -:106F70000020B0BD0223002A07D00023022804D835 -:106F8000C0000818B42142500023D8B2704780B521 -:106F9000FFF7AEFE002080BDF0B581B00C4605467F -:106FA0000026B4272846314600F066F9002807D0AD -:106FB000E8590068FEF7AAFE024628462146904797 -:106FC0000837761C032EEDD1002001B0F0BDF0B5DE -:106FD00081B00C4605460026B4272846314600F00D -:106FE0004BF9002807D0E8594068FEF78FFE0246AB -:106FF0002846214690470837761C032EEDD1002005 -:1070000001B0F0BDB0B504462546A835284600F0CD -:1070100077FB942001212150AE20205A9821605006 -:10702000A820215C1F200840022808D001280BD08E -:1070300000280ED12046294600F02BF90EE020460C -:10704000294600F0D8FA09E02046294600F0AFFAB8 -:1070500004E0802001402046FFF7BEFE0020B0BDC6 -:10706000F0B583B002920446019100291CD0254658 -:107070009C350027B4262046394600F0FDF800284C -:107080000DD0A0598069002809D02978032906D19C -:10709000FEF73CFE034620460199029A98470836BF -:1070A0007F1C032FE7D12FE09420205803282BD1F9 -:1070B000E16D206E81420AD9091AE165814200D34F -:1070C00001468AB22046029900F0C7FD1CE0264620 -:1070D0009C360025B4272046294600F0CDF800282C -:1070E0000BD0E0590069002807D03178032904D17A -:1070F000FEF70CFE01462046884708376D1C032D1D -:10710000E9D1204600F0B0FD002003B0F0BDF0B59D -:1071100081B00446009100291BD027469C370026E9 -:10712000B4252046314600F0A7F800280CD060595D -:107130004069002808D03978032905D1FEF7E6FD1B -:1071400002462046009990470835761C032EE8D168 -:107150004DE094202058022842D1E069266AB042CE -:107160000AD9D022A1588919A150801BE06182B2AE -:10717000204600F064FD33E0A5692846314601F061 -:10718000A9FCB5420FD300290DD1982020582646DE -:107190009836854207D20025204629462A4600F027 -:1071A0004EFD35601CE026469C360025B42720465F -:1071B000294600F061F800280BD0E059C06800288B -:1071C00007D03178032904D1FEF7A0FD01462046FF -:1071D000884708376D1C032DE9D1204600F050FD8B -:1071E000A020205CA034012801D1002020700020C4 -:1071F00001B0F0BD70B504469C200121215440200F -:10720000206220660025B4262046294600F034F886 -:10721000002807D0A0594068FEF778FD0246217982 -:107220002046904708366D1C032DEDD1002070BD1F -:10723000017400207047002070470020704770B52F -:1072400004469C20205C032814D10025B426204647 -:10725000294600F011F8002808D0A059C06900287C -:1072600004D0FEF753FD01462046884708366D1CC2 -:10727000032DECD1002070BD02460020022907D862 -:10728000C8001018B42141580120002900D1084637 -:10729000704780B54A78042A08DD072A0FDC052AE2 -:1072A00014D0062A1BD100F021F81DE0002A10D0CE -:1072B000012A17D0032A12D100F034F914E0082A69 -:1072C0000AD0092A0BD100F0BDF80DE000F094F8C7 -:1072D0000AE000F005F907E000F0EBF804E000F048 -:1072E000E3FB01E000F03BF9002080BDB0B582B0C7 -:1072F0000D46044601A8002101806A88100A05286D -:1073000012DC01281CD0022824D0032837D1D0B2A7 -:10731000022839DC00285FD0012865D002282ED150 -:10732000B0202058C0680EE006281CD0072823D0C3 -:107330000F2824D1B0202058C069002803D11EE0B6 -:10734000B02020580068FEF7E1FC0246207C01A92D -:1073500090472FE0B420205800282CD0217C002911 -:1073600022D0C06A21E0207C002808D1B420205817 -:10737000002804D0406B18E0207C00280ED0204666 -:10738000294600F091FB25E0032829D004282FD0BE -:107390000528F4D1B02020588069D4E7B4202058C3 -:1073A0000028ECD0006B00E0806AFEF7AFFC0146DD -:1073B00001A88847014601A80288002A0AD0E88867 -:1073C000002807D0824200D3024601A8028020464E -:1073D00000F020FC02B0B0BDB02020584068B2E7F9 -:1073E000B02020580069AEE7B02020588068AAE796 -:1073F000B02020584069A6E770B504468888002868 -:107400000BD1C888002808D148887F2606409C20D8 -:10741000205C25469C35032803D1204600F044FB20 -:1074200070BD9E202654F1B22046FFF731FD204664 -:1074300000F01AFC002E02D00220287070BD01203E -:10744000287070BD70B50D460446AE78022E1DD270 -:107450009C20215C20469C30032907D0022915D1AD -:10746000002E22D066600321017009E0002E12D0A8 -:107470006068B04219D0C1B22046FFF7A8FD66602F -:1074800020463146FFF788FD02280ED120462946C6 -:1074900000F00AFB70BD0221017066602046314693 -:1074A000FFF795FD204600F0DFFB204600F0DCFBF7 -:1074B00070BD80B5CA88012A0AD19C22825C032A49 -:1074C00009D0022A04D1002181600146083103E07D -:1074D00000F0EAFA80BD011D012200F09BFB80BD97 -:1074E000B0B504469C20205CFE220240022A15D141 -:1074F0000120E060A420215825460C3503200029F6 -:1075000005D0204600F0BCFBE16802200843E060A3 -:1075100002222046294600F07DFBB0BD204600F047 -:10752000C3FAB0BDB0B50D4604466888012815D130 -:10753000A42001212150287902280CD8C00020184D -:10754000B4214058002806D08068FEF7DFFB0246D1 -:10755000204629469047204600F086FBB0BDB0B5D6 -:107560000D4604469C20205CFE210140022919D1D1 -:10757000688801281AD1A4200021215028790228E6 -:107580000CD8C0002018B4214058002806D08068CC -:10759000FEF7BCFB0246204629469047204600F0F5 -:1075A00063FBB0BD2046294600F07EFAB0BDB0B501 -:1075B0000D4604469C20205C032816D12879022819 -:1075C00013D8C0002018B421405800280DD080687E -:1075D000FEF79CFB0246204629469047E888002893 -:1075E00007D1204600F040FB03E02046294600F08A -:1075F0005BFA0020B0BDB0B50D4604462878602285 -:1076000002402979202A0FD102290DD8C80020185C -:10761000B4228058002807D08068FEF777FB024626 -:1076200020462946904769E06878002816D001284E -:107630001DD0032862D19C20205C03281BD16888C0 -:10764000002807D180200843802803D02046FFF778 -:10765000C3FB297902294ED8C80040E09C20205C59 -:10766000032817D0022810D148060AD146E09C20F2 -:10767000205C032827D0022807D1802008438028D7 -:107680003CD02046FFF7A8FB38E02046294600F012 -:107690000BFA33E07F2008400001201805465435DE -:1076A00014308022114200D005462046FFF7DEFB51 -:1076B0000121002800D101462960022220462946E6 -:1076C00000F0A8FA1AE06888002817D1480612D0FE -:1076D0002046FFF7A7FB287902280CD8C000201805 -:1076E000B4214058002806D08068FEF70FFB024600 -:1076F000204629469047204600F0B6FA0020B0BD4B -:107700000A7802704A7842708A78CB781B02134359 -:1077100043800A794B791B02134383808A79C979A4 -:1077200009021143C180704710B504468021FFF75C -:1077300053FB00212046FFF74FFB10BD70B582B010 -:107740000D46044601A900200880694608702A7881 -:1077500060211140002910D0202938D169780A46CB -:107760000A3A022A33D302291BD0032919D0204612 -:10777000294600F099F9022029E069780B2913D0F5 -:107780000A290ED0062922D16888000A0022212861 -:107790000ED02228114616D101AE304600F058F81E -:1077A0000AE0694601220EE0204600F05DFA0DE095 -:1077B00001AE304600F032F801463288E888824255 -:1077C00000D302463280204600F024FA0020C0B2E6 -:1077D00002B070BDF0B581B0044682210326402579 -:1077E00032462B46FFF7B2FA022720463946324688 -:1077F0002B46FFF7ABFA204639462A46FFF773FBC4 -:10780000002001B0F0BD10B504468221FFF7CEFA8A -:1078100002212046FFF7CAFA002010BDAC21094A18 -:10782000515C0922012905D0002906D10749794474 -:10783000092204E00449794401E000221146028053 -:1078400008467047F4210020D2260000E6260000FA -:10785000F0B581B00446AC201349085C2221002811 -:1078600019D001281AD110488121032740263A4611 -:107870003346FFF76BFA01250B4829463A46334653 -:10788000FFF764FA084829463246FFF72CFB084800 -:107890007844222104E00548784401E000210846AC -:1078A000218001B0F0BDC046F4210020A7260000D1 -:1078B0008D260000F0B581B00446812103264025C5 -:1078C00032462B46FFF742FA012720463946324618 -:1078D0002B46FFF73BFA204639462A46FFF703FBC3 -:1078E000002001B0F0BD000080B5012903D103489C -:1078F0000121FEF75BFE002080BDC0465421002020 -:10790000B0B5144601290DD1012540222946FFF7C3 -:10791000EAFA2846FDF750FB0246034821462B466B -:10792000FEF7A6FF0020B0BD5421002080B502293B -:1079300003D103487844FDF79FFF002080BDC04677 -:1079400051D7FFFFB0B51446022919D102214022B8 -:10795000FFF7C9FA0B4DA879002811D10220FDF7D5 -:107960002BFB0246094878442146FDF7CBFE02284E -:1079700006D1072028700120A8710348006868809C -:107980000020B0BD34210020DC2100201FD7FFFFE4 -:1079900070B504468321032540262A463346FFF767 -:1079A000D5F9204629462A463346FFF7CFF9204627 -:1079B00029463246FFF797FA002070BD0020704735 -:1079C0000020704780B5032903D103487844FDF7B0 -:1079D00053FF002080BDC046C9D6FFFFB0B5144696 -:1079E000032919D103214022FFF77DFA0B4DA87915 -:1079F000002811D10320FDF7DFFA02460948784438 -:107A00002146FDF77FFE022806D10B2028700520B5 -:107A1000A8710348006868800020B0BD34210020B0 -:107A2000DC21002097D6FFFF12200880014878440F -:107A30007047C046B62700000420088001487844FB -:107A40007047C046B82700000E20088001487844DF -:107A50007047C046AC2700000E20088001487844DB -:107A60007047C046AA2700000A20088001487844D1 -:107A70007047C046A82700000E20088001487844BF -:107A80007047C0468A2700000E20088001487844CD -:107A90007047C0467A2700003920088001487844A2 -:107AA0007047C046C324000080B50A7852B2002A4D -:107AB00002DBFFF739FE80BD4A78772A0FD0062A0D -:107AC000F7D14A88194B9A42F3D1CA881221122A57 -:107AD00000D30A461649794400F09CF880BD8A8894 -:107AE000042A09D1CA882821282A00D30A46114924 -:107AF000794400F08FF880BD8A88052A09D1CA88A8 -:107B00009221922A00D30A460B49794400F082F868 -:107B100080BD8A88072ACCD1CA88B221B22A00D374 -:107B20000A460649794400F075F880BDEE0300006E -:107B3000E6240000DE240000EC24000064250000A0 -:107B400070B5044623480025D4222946FDF7BBF929 -:107B5000214E30460C3004222946FDF7B4F9103688 -:107B6000082230462946FDF7AEF9002C2DD0194CDD -:107B70000025D42220462946FDF7A5F91949794464 -:107B800020462A46FFF7C2F9174A7A44284621467A -:107B9000FFF7F0F90120154A7A442146FFF7EAF988 -:107BA000FF2252320D480E49FEF7F6FC0220104A21 -:107BB0007A442146FFF7DEF9032140222046FFF7F1 -:107BC00092F92046FFF7E3F970BD0248FFF7B7F9D5 -:107BD00070BDC046F4210020342100205421002033 -:107BE000E01F00201E240000B2250000DC2500005C -:107BF000FC25000060210180014878447047C046A0 -:107C0000262600000A210180014878447047C046BA -:107C100076260000B0B50C46942102234350D021B3 -:107C200044508261C261016A914200D80A4693B20F -:107C3000002529462246FFF73DF92846B0BDB0B5DC -:107C40000C46016A914200D80A4693B200252946A3 -:107C50002246FFF72FF92846B0BD10B50024214673 -:107C6000FFF741F9204610BD10B59421042242507F -:107C70000024214622462346FFF71CF9204610BD6A -:107C800010B5942105224250002421462246FFF7D8 -:107C90002AF9204610BD0000B0B512490A7801202B -:107CA000012A1DD8521E0C235343CB181A8B002ACD -:107CB00016D01969002913D09B8A002B06D1940095 -:107CC0000C190325ED436459E41C09D1934206D2F3 -:107CD0009A0089180322D2438958891C00D00020B9 -:107CE000B0BDC0461C1D002010B50E490A78012009 -:107CF000012A16D8521E0C235343CB181A8B002A84 -:107D00000FD0196900290CD09B8A541E9C4208DDB3 -:107D1000921E9A4204DD9A0089184968891C00D095 -:107D2000002010BD1C1D00200848017800290AD041 -:107D30000C224A4380184189028901208A4203D8D3 -:107D4000FF208A4200D3002040B270471C1D002053 -:107D5000F0B581B00146164A1078012826D8401E99 -:107D60000C234343D218168B002E1FD01569002D0B -:107D70001CD0022E1AD3948A13461433771EA742BE -:107D800014DDB61EA6420ADBA600AD196D68AE1C56 -:107D90000CD0ED1C03D100211980D18204E0D482E3 -:107DA000621C1A80002901D000F03EF801B0F0BD3D -:107DB0001C1D002080B50120FFF7CAFF80BD000018 -:107DC000B0B517490878012829D8401E0C22424333 -:107DD00089180A8B002A22D00C69002C1FD0022A95 -:107DE0001DD38D8A0B461433002D0AD0AA00A21889 -:107DF0000324E4431259921C11D0CD82691E1980CC -:107E00000BE0950064190325ED436459E41C06D189 -:107E1000044C14191C80521ECA8200F005F8B0BD33 -:107E20001C1D0020FEFF0000F0B581B004460C20B0 -:107E300060431A490E183069B18A890040583746A4 -:107E4000143710360321C943884224D8FDF75EFF5A -:107E500031683A889200895805680846FDF756FF50 -:107E6000002D06D00068FDF751FF014620468847E7 -:107E700011E08068FDF74AFF0546306839888900BF -:107E80004058FDF743FF4068FDF740FF024620469B -:107E9000294600F061F801B0F0BDC0461C1D00206D -:107EA000F0B581B02B4D2878012825D8401E0C262E -:107EB00070432A18108B00281ED0116900291BD08E -:107EC000928A824218D290000858FDF71FFF8068FE -:107ED00029784C1E6643002810D0A8190169808AB1 -:107EE00080000858FDF712FF8068FDF70FFF01467C -:107EF0000022204600F030F801B0F0BDA819038B35 -:107F0000002BF9D0828A014614319B1E9342F3DB89 -:107F100005699600AE1900967768FE1C13D0BE1C4A -:107F2000EAD1009E7668B61C09D1521C96B2B342C3 -:107F300004DBB600AE197668B61CF6D00A80C282A1 -:107F4000501C088002E000220A80C2822046FFF70F -:107F50006BFFD1E71C1D0020F0B583B001920C46E9 -:107F60000C221146029041431F4B5F1800213983B8 -:107F700039617961181DFCF7A6FF20463C46103494 -:107F80003D4618353E461636143700282AD0FDF7F0 -:107F9000BDFE206029888A008258521C06D0491CE8 -:107FA0008AB292008258521CF9D129800198002887 -:107FB00015D0FDF7ABFE054620683988890040588A -:107FC0000BE0FDF7A3FEA84209D038883080401CA2 -:107FD000388080B2800021680858411CF1D1029895 -:107FE000FFF722FF03B0F0BD1C1D002080B50A4939 -:107FF000884208D00949884208D00949884208D1F6 -:10800000FFF7DEFE05E0FFF74BFF02E00120FFF780 -:108010009FFE002080BDC04603000080020000805B -:108020000100008010B50146002000290FD1084C46 -:10803000218BA28A8A420AD22069FDF767FEA18AB3 -:1080400089004058FDF762FE4068FDF75FFE10BDF5 -:108050001C1D002080B503480078401EFFF7E2FF9A -:1080600080BDC0461C1D002010B5044600F04EFC2B -:108070002420604308490818C42105224254C02125 -:10808000064A7A444250BD2101224254D021044A7A -:108090007A44425010BDC0461C1D00200A22000038 -:1080A00059FFFFFF80B500F041FB9D22002806D05C -:1080B00003498A5C112A02D1B422024B8B5280BD43 -:1080C0001C1D00200A80000010B50446FFF7CCFFFD -:1080D0002420604304490818CC21044A7A444250C1 -:1080E000204600F0E9FB10BD1C1D0020C5FFFFFF6E -:1080F00080B500F01BFB9D22002806D003498A5C56 -:10810000102A02D3B422024B8B5280BD1C1D0020CA -:108110000A80000010B50446FFF7A6FF2420604344 -:1081200004490818CC21044A7A444250204600F001 -:10813000C3FB10BD1C1D0020C5FFFFFF70B5054629 -:10814000FFF788FF0446114E30469C302022294616 -:10815000FCF7A3FE68780146103905290AD29D2054 -:10816000305C0F21014088002058B82170509C36A7 -:10817000304670BD022803D00128F8D1616800E0C4 -:10818000E16800200029F2D1F3E7C0461C1D002061 -:1081900010B5044600F0BAFB242060430B490818D0 -:1081A000C42106224254C021094A7A444250BD21CA -:1081B00001224254CC21074A7A444250D021064A37 -:1081C0007A444250204600F077FB10BD1C1D002071 -:1081D0008221000081FFFFFF29FEFFFFF0B587B07D -:1081E0000E46FFF71FFF06904B4C20460C30002533 -:1081F000022729463A46FCF766FE20460E300595D2 -:1082000029463A46FCF75FFE701C049002D0A06835 -:1082100000287DD006984068FDF778FD054600F0FF -:10822000EBFE291801220592012871DB6068059098 -:10823000A068029000200390069001952B468B4287 -:10824000039C1A4620D200201A46044626469D1951 -:10825000C01D741C722813D82F781F2F04DD202F07 -:1082600009D02D2F07D003E0092F04D00A2F09D001 -:108270005F2F00D015462A461D198D42E6D303E034 -:10828000344601E09A19741C1819884224D2002C33 -:10829000069D22D09A4220D00025ED43455D2C2D2D -:1082A00006DC2E46093E022E16D3202D14D003E004 -:1082B0002D2D11D05F2D0FD000782C2805DC054620 -:1082C000093D022D08D3202802E02D2804D05F2884 -:1082D000069D02D0D41A00E0069D0498002806D01E -:1082E0000598A84203D10598029A90420AD31B1917 -:1082F000681C8B4200D328468B4206909FD3401CBB -:10830000059005E004480146CC810198181A88813F -:10831000059807B0F0BDC0461C1D0020B0B504464E -:10832000FFF7A2FE094D69682046FFF757FF24209A -:1083300060432818CC21064A7A444250D021054A8D -:108340007A444250204600F0B7FAB0BD1C1D002010 -:108350001D00000015010000F0B583B00546FFF7D1 -:1083600079FE0446374E30469C3020222946FCF7E1 -:1083700094FD6878102816DC012833D002283BD001 -:1083800010285AD12068002841D0B468FDF7BEFCFF -:1083900003467068B1686A46401C03C2012C41D88C -:1083A0002A4A7A4440E001461139032945D20F2177 -:1083B0000840401E40003718FD89002D3DD0606800 -:1083C000FDF7A4FCB98940186946086034461C349E -:1083D0008021204A7A4420462B46FDF7C3FAB82074 -:1083E00034502AE0FFF758FC01460020002924D031 -:1083F0007168002923D020E0FFF776FC00281CD00C -:108400007168B068421E0020914216D117E0716871 -:10841000B0686A46106030461C304B1C80210C4A04 -:108420007A4404E0084A7A4430461C308021FDF743 -:1084300099FA30461C30B82170509C36304603B053 -:10844000F0BDC0461C1D0020C61F000051130000D7 -:10845000D71F00002920000080B5174988420BD0A3 -:108460001649884213D01649884222D115484168DE -:1084700000291CD0491E14E012498868002803D046 -:108480004968401E884214D1FFF70AFD11E00D48EB -:1084900041688268521E914202D1FFF78BFC08E0CE -:1084A000491C41600078401EFFF738FF01E0FFF7EC -:1084B00087FC002080BDC0460300008002000080D1 -:1084C000010000801C1D002070B50446FFF72CFC45 -:1084D00001280BD0401C0FD11C4E301D00250C2252 -:1084E0002946FCF7F0FCE843706005E01748001DE2 -:1084F00000210C22FCF7E7FC204600F007FA20469A -:10850000FFF790FD4068002819D00020C1432046A5 -:10851000FFF764FE0D4DA860002807D1281D00213B -:108520000C22FCF7D0FCA868002804D0401E696823 -:10853000814200D968602046FFF7F0FE70BD034815 -:10854000001D00210C22FCF7BEFC70BD1C1D00208C -:1085500070B50546FFF77EFD0446124E30469C304E -:1085600020222946FCF799FC68780F2806DC0128B0 -:108570000AD0022812D1FFF7B7FB07E010280AD073 -:1085800011280BD1606807E0FFF786FB0146002049 -:10859000002903D070BD2068B82170509C36304649 -:1085A00070BDC0461C1D002010B5044600F0AEF999 -:1085B000242060430B490818C42105224254C021DD -:1085C000094A7A444250BD2101224254CC21074A33 -:1085D0007A444250D021064A7A444250204600F064 -:1085E0006BF910BD1C1D0020421E00007DFFFFFF27 -:1085F00011FAFFFF70B50546FFF72CFD0446164E35 -:1086000030469C3020222946FCF747FC68780F282A -:1086100007DC012812D0022813D00F2818D12068B7 -:1086200009E01038022813D29D20305C0F21014050 -:10863000880020184068B821705009E0FFF72CFB33 -:1086400001E0FFF751FB01460020002900D070BD7A -:108650009C36304670BDC0461C1D002010B5044637 -:1086600000F054F92420604308490818C421062268 -:108670004254C021064A7A444250BD21012242544C -:10868000D021044A7A44425010BDC0461C1D00202F -:108690002E1E000065F9FFFF10B5044600F036F904 -:1086A000242060430B490818C42106224254C021EB -:1086B000094A7A444250BD2101224254D021074A3E -:1086C0007A444250CC21064A7A444250204600F077 -:1086D000F3F810BD1C1D0020F21D000029F9FFFF5A -:1086E00029FFFFFF80B5FFF785FF9D22002806D0F8 -:1086F00003498A5C102A02D3B4220A238B5280BD1C -:108700001C1D002010B50446FFF7A8FF242060437D -:1087100004490818CC21044A7A444250204600F00B -:10872000CBF810BD1C1D0020C9FFFFFF70B505462A -:10873000FFF790FC0446124E30469C30202229461A -:10874000FCF7ABFB6878022804D0012809D1FFF7B9 -:10875000A3FA01E0FFF7C8FA0146002000290BD078 -:1087600070BD9D20305CF021084205D00F210840EB -:1087700080002058B82170509C36304670BDC046ED -:108780001C1D0020B0B51749884211D016498842F7 -:1087900015D01649884222D1F820154C2158E025E1 -:1087A0006059401E8847002819D06059401E11E0CA -:1087B000E0200F490858FC22895888470FE0F8202C -:1087C0000B4C2158E0256059401C8847002806D0F2 -:1087D0006059401C60512078401E00F00BF80020CA -:1087E000B0BDC04603000080020000800100008090 -:1087F0001C1D0020F0B581B004460120C6430C4D7D -:108800002F46E437F8202958E020285830188847A8 -:1088100001C7761C032EF5D12046FFF7B9FC2420B2 -:1088200060432818D021034A7A44425001B0F0BD79 -:108830001C1D002059FFFFFFB0B50446F8200B4D6A -:108840002950E0202B50FC202A502046FFF7EAFB5D -:10885000E435A84206D00649794400222046FFF7B5 -:108860007BFBB0BD2046FFF7C5FFB0BD1C1D00203F -:108870001C1D000080B50023FFF7DEFF80BD000057 -:10888000B0B50C4D2878002811D12846BC30002402 -:1088900024222146FCF717FB28780C225043281885 -:1088A00010302146FCF70FFB2878401C2870C0B21E -:1088B000401EB0BD1C1D0020B0B504461248027811 -:1088C000002A0ED0611C91420BD12421614345182E -:1088D000FCF76CFCBE2000212952204600F02AF84B -:1088E000B0BD01210023002A0A4600D01A46641CAC -:1088F00000D019461143012904D14178AA2901D198 -:1089000069214170B0BDC0461C1D002070B52424F3 -:10891000604307490E18FCF749FC3046BC3000257F -:1089200029462246FCF7CFFABC20355470BDC0461C -:108930001C1D0020F0B581B004460420FDF7ACFCFE -:1089400000283CD097283AD0242060431D490C18B9 -:10895000C02020582546C0352646BE3600282ED0D9 -:108960002046CC300090C4343088AA27217880B2C9 -:10897000884224D2FDF75CFC002820D1FDF7DAFB09 -:10898000B84203D1FDF700FCB84218D128683188FD -:108990004901401800990968002902D08847002839 -:1089A00007D0012803D12868318849014018FBF716 -:1089B00003FA3088401C308029680029D6D101B0E4 -:1089C000F0BDC0461C1D0020002243088B4274D31A -:1089D00003098B425FD3030A8B4244D3030B8B42C0 -:1089E00028D3030C8B420DD3FF22090212BA030CC9 -:1089F0008B4202D31212090265D0030B8B4219D3AA -:108A000000E0090AC30B8B4201D3CB03C01A5241C9 -:108A1000830B8B4201D38B03C01A5241430B8B4211 -:108A200001D34B03C01A5241030B8B4201D30B03FA -:108A3000C01A5241C30A8B4201D3CB02C01A524121 -:108A4000830A8B4201D38B02C01A5241430A8B42E4 -:108A500001D34B02C01A5241030A8B4201D30B02CD -:108A6000C01A5241CDD2C3098B4201D3CB01C01AE7 -:108A7000524183098B4201D38B01C01A52414309F1 -:108A80008B4201D34B01C01A524103098B4201D3DF -:108A90000B01C01A5241C3088B4201D3CB00C01A4C -:108AA000524183088B4201D38B00C01A52414308C4 -:108AB0008B4201D34B00C01A5241411A00D20146E9 -:108AC000524110467047FFE701B5002000F0F0F872 -:108AD00002BDC0460029F7D076E7704703460B4336 -:108AE0007FD4002243088B4274D303098B425FD3A7 -:108AF000030A8B4244D3030B8B4228D3030C8B42D3 -:108B00000DD3FF22090212BA030C8B4202D31212B8 -:108B1000090265D0030B8B4219D300E0090AC30B8D -:108B20008B4201D3CB03C01A5241830B8B4201D33A -:108B30008B03C01A5241430B8B4201D34B03C01A23 -:108B40005241030B8B4201D30B03C01A5241C30A9B -:108B50008B4201D3CB02C01A5241830A8B4201D30C -:108B60008B02C01A5241430A8B4201D34B02C01AF6 -:108B70005241030A8B4201D30B02C01A5241CDD29B -:108B8000C3098B4201D3CB01C01A524183098B42E6 -:108B900001D38B01C01A524143098B4201D34B01CF -:108BA000C01A524103098B4201D30B01C01A524132 -:108BB000C3088B4201D3CB00C01A524183088B42B9 -:108BC00001D38B00C01A524143088B4201D34B00A2 -:108BD000C01A5241411A00D2014652411046704714 -:108BE0005DE0CA0F00D04942031000D34042534019 -:108BF00000229C4603098B422DD3030A8B4212D3D9 -:108C0000FC22890112BA030A8B420CD3890192110A -:108C10008B4208D3890192118B4204D389013AD047 -:108C2000921100E08909C3098B4201D3CB01C01A1C -:108C3000524183098B4201D38B01C01A524143092F -:108C40008B4201D34B01C01A524103098B4201D31D -:108C50000B01C01A5241C3088B4201D3CB00C01A8A -:108C6000524183088B4201D38B00C01A5241D9D2A2 -:108C700043088B4201D34B00C01A5241411A00D223 -:108C80000146634652415B10104601D34042002B1F -:108C900000D54942704763465B1000D3404201B59E -:108CA000002000F005F802BD0029F8D016E7704753 -:108CB0007047C04610B5002200F00AF810BDC0464B -:108CC00010B500F031F810BD10B500F07FF810BD00 -:108CD0000B0010B511001A0000F0D4F810BDC0460A -:108CE00030B5032A0CD903000B439B0719D1036845 -:108CF0000C68A34215D1043A04300431032AF6D893 -:108D0000551E002A0BD0002303E05A1C9D4206D0BA -:108D10001300C25CCC5CA242F7D0101B00E0002024 -:108D200030BD551EEFE7C046F0B5C64600B50F2A68 -:108D300041D903270D003E0005430C0003002E40DF -:108D40002F423DD11500103D2D09AC462D01A846FE -:108D50008044256867681D605F60A568E7689D605E -:108D6000DF6010341F0010334745F2D165460F23F2 -:108D70000C2401352D01491913404519144222D004 -:108D80008C59AC5104369C1B032CF9D80324043BAA -:108D90009B0801339B002240ED18C918561E002A7B -:108DA00006D00023CC5C1A00EC5401339642F9D172 -:108DB00080BCB846F0BD0500561E002AF1D1F7E789 -:108DC0000500561EEDE71A00F6E7C046F0B5C646A8 -:108DD00000B588420CD98B18984209D2531E002A3C -:108DE00003D0CA5CC254013BFBD280BCB846F0BD84 -:108DF0000F2A0BD80500561E002AF6D00023CC5CA3 -:108E00001A00EC5401339642F9D1EEE703270D0026 -:108E10003E0005430C0003002E402F422CD11500CC -:108E2000103D2D09AC462D01A846804425681F0041 -:108E30001D6065685D60A5689D60E5681034DD6053 -:108E400010334745F2D165460F230C2401352D011F -:108E5000491913404519144211D08C59AC510436AC -:108E60009C1B032CF9D80324043B9B0801339B0073 -:108E7000ED18C9182240BEE70500561EBEE71A00CD -:108E8000B9E7C046F0B5050083074AD0541E002A52 -:108E900044D003000322CEB202E00135013C3DD3B1 -:108EA00001332E701342F8D1032C2FD9FF220A4030 -:108EB000150215432A0415430F2C35D92700103FFE -:108EC0003F093E01B4461E001A0010366644156084 -:108ED00055609560D5601032B242F8D10F260C2251 -:108EE00001373F012640DB193700224217D03E1FD1 -:108EF000B608B400A4461A001C1D644420C2A24255 -:108F0000FCD103240136B6009B193C40002C05D04F -:108F1000C9B21C19197001339C42FBD1F0BD340059 -:108F2000F4E714000300BFE72700E0E7F0C0414684 -:108F30004A4653465C466D4676467EC02838F0C8A1 -:108F40000020704710307CC890469946A246AB4638 -:108F5000B54608C82838F0C8081C00D101201847B9 -:108F6000024670B50A4392072AD11E4DEE0104C88D -:108F700008C9541B9443344017D0D0B2D9B2401A18 -:108F80002106014310D190B299B2401A2104014345 -:108F90000AD110021902000A090A401A21020143EB -:108FA00002D1100E190E401A70BD9A42DFD010BACD -:108FB00019BA884201D9012070BD0020C04370BD9C -:108FC00002780B7801300131002A09D09A4207D18A -:108FD00002780B7801300131002A01D09A42EFD09B -:108FE000D01A70BD0101010103000A7801311A7025 -:108FF0000133002AF9D1704710B583070AD0030066 -:10900000032102E001330B4205D01A78002AF9D17E -:10901000181A10BD030019680C4A0D4C8A188A43AF -:1090200022420FD15968094A04338A188A432242DE -:1090300008D15968054A04338A188A432242F1D07C -:1090400000E001331A78002AFBD1E1E7FFFEFEFEC3 -:109050008080808030B5002A28D003000B439B0716 -:1090600013D1032A11D9134D0BE0043A002A1DD065 -:10907000114C1C199C432C4218D104300431032A92 -:1090800003D903680C68A342EFD004780D78A54299 -:109090000ED1012A0AD0012306E0C45CCD5CAC42AB -:1090A00006D101339A4201D0002CF6D1002030BD08 -:1090B000601BFCE780808080FFFEFEFEF0B50C00A8 -:1090C000044303000600A40712D1032A10D9144C4C -:1090D000A44666460D68134C1F002C19AC4334425D -:1090E0001CD10433043A1E0004313D60032AF0D839 -:1090F0000024B71806E00D5D013A3555BB1A01345E -:10910000002D02D0002AF6D1F0BD0021D418002A8B -:10911000FAD0197001339C42FBD1F5E71E00E7E756 -:1091200080808080FFFEFEFE30B5050008002B0029 -:109130006C18002903D106E001339C4203D01A7851 -:10914000002AF9D1581B30BD25303858001976A9AE -:109150001488AC17A914873DA91487209EC9845A86 -:10916000CB02FAB24E1C0368B3B517C1A4488FBA3C -:1091700097F0E3459AC053EA0100000003C01F02C4 -:10918000B41600142200203F76A91488AC209EC992 -:10919000845ACB02FAB24E1C0368B3B517C1A44877 -:1091A0008FBA97F0E3459AC053EA0100000003C06C -:1091B0001F02B42575003132333435363738394122 -:1091C000424344454647484A4B4C4D4E50515253FA -:1091D0005455565758595A616263646566676869A1 -:1091E0006A6B6D6E6F707172737475767778797A59 -:1091F000205369676E6564204D6573736167653AD6 -:109200000AE0E0E0E0E0E0E0E0E0E0E0E0E02022B2 -:109210002426404244484A4EC0C4160101000101C0 -:109220000101010101000000DD17D0C0191DD0C0EF -:109230007103D0C01917D0C0C105D0C01D04D0C063 -:109240005D12D0C04D14D0C09D10D0C0A91CD0C09C -:10925000E503D0C02503D0C05502D0C06269746355 -:109260006F696E636173680071707A7279397838EA -:10927000676632747664773073336A6E35346B6840 -:109280006365366D7561376C0000000000000000FA -:10929000FFFFFF000000FEC1FF3030EC0D03C3DE16 -:1092A0003030EC0D03C3C0F03FF8070000000000B1 -:1092B0000E0000000E000000010000008C92D0C0E3 -:1092C0009492D0C000000000FFFFFF0000000000EB -:1092D0000C400BF807FCC0F3F03CF003FE012D003E -:1092E00003000000000000000E0000000E0000005F -:1092F00001000000C492D0C0CC92D0C00000000099 -:10930000FFFFFF00008001E6C071383807FC001E37 -:109310008007F003CEC1E13870061800000000009D -:109320000E0000000E00000001000000FC92D0C002 -:109330000493D0C000000000FFFFFF000000000009 -:109340000C8007F003FEC1FFF03FF003CC0033C0F8 -:109350000C000000000000000E0000000E000000E5 -:10936000010000003493D0C03C93D0C00000000046 -:10937000FFFFFF004111050107000000040000008D -:10938000010000006C93D0C07493D0C000000000B6 -:10939000FFFFFF00000000001EE01F1C0E03638C97 -:1093A00019630C0C87837F80070000000000000019 -:1093B0000E0000000E000000010000008C93D0C0E1 -:1093C0009493D0C000000000FFFFFF004812420845 -:1093D000040000000700000001000000C493D0C09A -:1093E000CC93D0C000000000FFFFFF0021842401C7 -:1093F000040000000700000001000000E493D0C05A -:10940000EC93D0C000000000FFFFFF00088A28088E -:109410000700000004000000010000000494D0C018 -:109420000C94D0C000000000FFFFFF00000000000F -:109430000000C000380067E0381C9C037E000F80ED -:1094400001000000000000000E0000000E000000FF -:10945000010000002494D0C02C94D0C00000000073 -:10946000FFFFFF00000030000C80072001CC00331C -:10947000E01C3807FFC3F3F87CFE1F00000000006B -:109480000E0000000E000000010000005C94D0C03F -:109490006494D0C04175746F20417070726F7661B2 -:1094A0006C004D616E75616C20417070726F7661F9 -:1094B0006C004261636B005075626C6963206B6580 -:1094C0007973206578706F7274004170706C696395 -:1094D0006174696F6E00697320726561647900530D -:1094E000657474696E67730056657273696F6E0098 -:1094F000312E352E330051756974005369676E0043 -:109500006D657373616765004D6573736167652091 -:10951000686173680043616E63656C007369676EB0 -:109520006174757265005265766965770074726161 -:109530006E73616374696F6E00416D6F756E740058 -:1095400041646472657373004665657300416363CB -:1095500065707400616E642073656E640052656AA4 -:10956000656374004F505F53454E44455200436F4E -:109570006E6669726D005468652064657269766113 -:1095800074696F6E007061746820697320756E7500 -:109590007375616C210044657269766174696F6EE0 -:1095A00020706174680052656A6563742069662082 -:1095B000796F75277265006E6F7420737572650020 -:1095C000417070726F766520646572697661746946 -:1095D0006F6E00417070726F766500436F6E6669E2 -:1095E000726D20746F6B656E004578706F727400D9 -:1095F0007075626C6963206B65793F005468652003 -:109600006368616E676520706174680069732075B6 -:109610006E757375616C004368616E67652070617B -:10962000746800546865207369676E20706174689F -:10963000005369676E207061746800556E766572BC -:10964000696669656420696E70757473005570642D -:1096500061746500204C6564676572204C697665AD -:10966000006F72207468697264207061727479008E -:1096700077616C6C657420736F66747761726500D6 -:10968000436F6E74696E756500554E4B4E4F574E65 -:1096900000524557415244004F505F53454E444598 -:1096A000525F435245415445004F505F435245413C -:1096B0005445004C0E968C0044656C65676174657A -:1096C00020746F2025732028666565202564202579 -:1096D0002529003D666E8B00303132333435363704 -:1096E00038394142434445460043616C6C20636F06 -:1096F0006E7472616374202573006F6D6E69004F24 -:109700004D4E4920005553445420004D41494420BA -:10971000004F4D4E4920617373657420256420000D -:10972000252E2A482E2E2E252E2A48006F7574705D -:10973000757420232564005174756D005154554D86 -:10974000007471009494D0C0A294D0C0B294D0C0E0 -:10975000B794D0C0B294D0C0CA94D0C0D694D0C070 -:109760001581D0C05897D0C0000000000000000054 -:10977000593CD0C0000000000000000000000000C4 -:109780007097D0C0FFFFFFFFE892D0C0DF94D0C039 -:10979000A985D0C08897D0C08097D0C000000000B5 -:1097A000E894D0C0F094D0C0C980D0C0A097D0C0F9 -:1097B0000000000000000000753CD0C00000000068 -:1097C0000000000000000000B897D0C0FFFFFFFFBE -:1097D0005893D0C0F694D0C0A985D0C0D097D0C03F -:1097E000C897D0C0000000006097D0C09097D0C04C -:1097F000A897D0C0D897D0C0FDFFFFFFFFFFFFFFA5 -:10980000B092D0C0FB94D0C00095D0C00587D0C026 -:109810000098D0C000000000000000000895D0C0F3 -:1098200000180020C984D0C01C98D0C000000000DF -:10983000000000007F3CD0C00000000000000000DD -:10984000000000003498D0C0FFFFFFFF4894D0C054 -:10985000FB94D0C00095D0C09986D0C04C98D0C0A1 -:109860004498D0C0000000008D3CD0C00000000033 -:1098700000000000000000006898D0C0FFFFFFFF5C -:109880002093D0C01595D0C01C95D0C09986D0C06B -:109890008098D0C07898D0C0000000000C98D0C04C -:1098A0002498D0C05898D0C08C98D0C0FFFFFFFF3C -:1098B000B093D0C02695D0C0551800200587D0C0E1 -:1098C000B098D0C000000000000000003995D0C062 -:1098D00041180020C984D0C0CC98D0C0000000003E -:1098E000000000004095D0C000180020C984D0C0FE -:1098F000E498D0C000000000000000009B3CD0C0F5 -:10990000000000000000000000000000FC98D0C033 -:10991000FFFFFFFF4894D0C04D95D0C0A985D0C0AF -:109920001499D0C00C99D0C000000000AF3CD0C04A -:109930000000000000000000000000002C99D0C0D2 -:10994000FFFFFFFF2093D0C05D95D0C0A985D0C098 -:109950004499D0C03C99D0C000000000BC98D0C051 -:10996000D498D0C0EC98D0C01C99D0C04C99D0C02D -:10997000FFFFFFFFB093D0C06E95D0C02D95D0C033 -:109980000587D0C07499D0C000000000000000001E -:109990004895D0C055180020C984D0C09099D0C037 -:1099A0000000000000000000C33CD0C00000000028 -:1099B0000000000000000000A899D0C0FFFFFFFFDA -:1099C0004894D0C04D95D0C05495D0C09986D0C091 -:1099D000C099D0C0B899D0C000000000D73CD0C01A -:1099E000000000000000000000000000DC99D0C072 -:1099F000FFFFFFFF2093D0C05D95D0C0A985D0C0E8 -:109A0000F499D0C0EC99D0C000000000EB3CD0C06D -:109A10000000000000000000000000000C9AD0C010 -:109A2000FFFFFFFF4894D0C0FB94D0C06495D0C026 -:109A30009986D0C0249AD0C01C9AD0C000000000E3 -:109A40008099D0C09899D0C0CC99D0C0FC99D0C092 -:109A5000FFFFFFFF8099D0C09899D0C0309AD0C046 -:109A6000FC99D0C0FFFFFFFF8094D0C07695D0C096 -:109A70008595D0C00587D0C0689AD0C0000000008E -:109A8000000000009695D0C000180020C984D0C006 -:109A9000849AD0C00000000000000000FF3CD0C04D -:109AA0000000000000000000000000009C9AD0C0F0 -:109AB000FFFFFFFF2093D0C0A695D0C0B795D0C0C0 -:109AC0000587D0C0B49AD0C0AC9AD0C000000000C6 -:109AD0004894D0C0C095D0C01E96D0C00587D0C0D5 -:109AE000D09AD0C000000000000000004095D0C017 -:109AF000A8200020C984D0C0EC9AD0C0000000008B -:109B0000000000000D3DD0C000000000000000007B -:109B100000000000049BD0C0FFFFFFFF4894D0C0AE -:109B2000D395D0C0A985D0C01C9BD0C0149BD0C0F9 -:109B3000000000001B3DD0C000000000000000003D -:109B400000000000349BD0C0FFFFFFFF2093D0C077 -:109B50005D95D0C0A985D0C04C9BD0C0449BD0C0DF -:109B600000000000749AD0C08C9AD0C0C09AD0C0B7 -:109B7000DC9AD0C0FEFFFFFFF49AD0C0249BD0C077 -:109B8000549BD0C0FFFFFFFFF49AD0C0249BD0C0ED -:109B9000549BD0C0FFFFFFFF293DD0C00000000054 -:109BA0000000000000000000989BD0C0FFFFFFFFF6 -:109BB0004894D0C0DB95D0C0A82000209986D0C0A2 -:109BC000B09BD0C0A89BD0C000000000373DD0C0E3 -:109BD000000000000000000000000000CC9BD0C08E -:109BE000FFFFFFFF2093D0C05D95D0C0A985D0C0F6 -:109BF000E49BD0C0DC9BD0C000000000BC9BD0C068 -:109C0000EC9BD0C0FFFFFFFF453DD0C0000000002F -:109C10000000000000000000089CD0C0FFFFFFFF14 -:109C20004894D0C0E995D0C0F095D0C09986D0C0F6 -:109C3000209CD0C0189CD0C000000000533DD0C074 -:109C40000000000000000000000000003C9CD0C0AC -:109C5000FFFFFFFF2093D0C05D95D0C0A985D0C085 -:109C6000549CD0C04C9CD0C0000000002C9CD0C0A4 -:109C70005C9CD0C0FFFFFFFFB093D0C0FC95D0C06C -:109C80000C96D0C09986D0C0789CD0C0000000004F -:109C9000000000001796D0C000180020C984D0C072 -:109CA000949CD0C00000000000000000613DD0C0C6 -:109CB000000000000000000000000000AC9CD0C0CC -:109CC000FFFFFFFF2093D0C0A695D0C0B795D0C0AE -:109CD0009986D0C0C49CD0C0BC9CD0C000000000FD -:109CE0006F3DD0C000000000000000000000000038 -:109CF000E09CD0C0FFFFFFFF4894D0C0D395D0C0F8 -:109D0000A985D0C0F89CD0C0F09CD0C00000000055 -:109D1000849CD0C09C9CD0C0D09CD0C0009DD0C0A2 -:109D2000FFFFFFFFB093D0C02396D0C00C96D0C0E9 -:109D30009986D0C0249DD0C0000000000000000023 -:109D40003196D0C000180020C984D0C0409DD0C03A -:109D500000000000000000007D3DD0C000000000B9 -:109D60000000000000000000589DD0C0FFFFFFFF72 -:109D70002093D0C0A695D0C0B795D0C09986D0C04A -:109D8000709DD0C0689DD0C0000000008D3DD0C047 -:109D90000000000000000000000000008C9DD0C00A -:109DA000FFFFFFFF4894D0C0D395D0C0A985D0C095 -:109DB000A49DD0C09C9DD0C000000000309DD0C0AC -:109DC000489DD0C07C9DD0C0AC9DD0C0FFFFFFFFA0 -:109DD0008094D0C03B96D0C0A985D0C0D09DD0C0C3 -:109DE00000000000000000004D96D0C05496D0C086 -:109DF0001581D0C0E89DD0C0000000000000000028 -:109E00006196D0C07096D0C01581D0C0009ED0C0E1 -:109E100000000000000000009D3DD0C000000000D8 -:109E20000000000000000000189ED0C0FFFFFFFFF0 -:109E30002093D0C01595D0C0A985D0C0309ED0C089 -:109E4000289ED0C000000000AB3DD0C00000000044 -:109E50000000000000000000489ED0C0FFFFFFFF90 -:109E60004894D0C08096D0C0A985D0C0609ED0C094 -:109E7000589ED0C000000000D89DD0C0F09DD0C03A -:109E8000089ED0C0389ED0C0689ED0C0FFFFFFFFA4 -:109E90004F505F52455455524E000000556E646558 -:109EA0006C6567617465000000000000B00100008F -:109EB00000B0A7000000B00200000030313233349F -:109EC0003536373839616263646566303132333430 -:109ED00035363738394142434445466F0090016773 -:109EE000006985F1D00000000042544300900090CA -:109EF00000006A805532465F56329000010990009A -:109F00006E006D00FFFFFFFF00000000092111013E -:109F1000210122220000000009211101000122225A -:109F20000006D0F10901A1010903150026FF007503 -:109F300008954081080904150026FF007508954022 -:109F40009108C006A0FF0901A1010903150026FF21 -:109F5000007508954081080904150026FF00750862 -:109F600095409108C0050F3900021810050038B659 -:109F70000834A909A0478BFDA0768815B6650001B5 -:109F80001E001C100500DF60DDD88945C74C9CD23F -:109F9000659D9E648A9F00000306B2007700000062 -:109FA000297AD0C0397AD0C0497AD0C0597AD0C085 -:109FB000697AD0C0797AD0C0897AD0C0997AD0C075 -:109FC00012034D00530046005400310030003000B1 -:109FD00077002800000000010400010000000000DC -:109FE0000000020157494E55534200000000000096 -:109FF00000000000000000000000920000000001CE -:10A000000500010088000000070000002A0044004D -:10A010006500760069006300650049006E00740009 -:10A02000650072006600610063006500470055002E -:10A030004900440073000000500000007B00310024 -:10A0400033006400360033003400300030002D004F -:10A0500032004300390037002D003000300030005E -:10A0600034002D0030003000300030002D0034006E -:10A070006300360035003600340036003700360005 -:10A080003500370032007D00000000000A000000AB -:10A0900000000306B200080001000000A80008004C -:10A0A00002000200A0001400030057494E5553421D -:10A0B0000000000000000000000084000400070011 -:10A0C0002A004400650076006900630065004900CD -:10A0D0006E00740065007200660061006300650038 -:10A0E00047005500490044007300000050007B0009 -:10A0F000430045003800300039003200360034009B -:10A100002D0034004200320034002D0034004500A0 -:10A11000380031002D0041003800420032002D008F -:10A120003500370045004400300031004400350060 -:10A1300038003000450031007D00000000000000C4 -:10A14000D577D0C00778D0C03D77D0C000000000E0 -:10A15000000000002D79D0C04579D0C0000000007B -:10A160000000000000000000F57BD0C0F57BD0C0EF -:10A17000F57BD0C0057CD0C0B578D0C00778D0C002 -:10A180003D77D0C00000000000000000E978D0C09A -:10A190000179D0C0000000000000000000000000B5 -:10A1A000F57BD0C0F57BD0C0F57BD0C0057CD0C09E -:10A1B0009179D0C0BD79D0C0C179D0C00000000075 -:10A1C00000000000C579D0C0DD79D0C000000000DB -:10A1D0000000000000000000F57BD0C0F57BD0C07F -:10A1E000F57BD0C0057CD0C01201100200000040F9 -:10A1F000972C0100010201020301040309040E036C -:10A200004C00650064006700650072000E034E009C -:10A2100061006E006F00200053000A033000300020 -:10A220003000310009026000030102C0320904005D -:10A23000000203000002092111010001222200078F -:10A2400005820340000107050203400001090401E3 -:10A25000000203010102092111012101222200074C -:10A2600005810340000107050103400001090402C4 -:10A270000002FFFFFF0207058303400001070503FB -:10A28000034000010A060002000000400100000037 -:10A29000030000000000800020000000010000001A -:10A2A00000000000FFFFFF000000000000000000B1 -:10A2B000050102000C00040007000000000000007F -:10A2C000FFFFFF000000000000000000D093D0C09E -:10A2D00005027A000C0004000700000000000000E6 -:10A2E000FFFFFF000000000000000000F093D0C05E -:10A2F000071000000C00800020000000000000009B -:10A30000FFFFFF00000000000880000000000000C8 -:10A31000071100001A00800020000000000000006B -:10A32000FFFFFF00000000000880000000000000A8 -:10A330000300000000008000200000000100000079 -:10A3400000000000FFFFFF00000000000000000010 -:10A35000050100000E0007000400000000000000DE -:10A36000FFFFFF0000000000000000001094D0C0BC -:10A37000050278000E000700040000000000000045 -:10A38000FFFFFF0000000000000000007893D0C035 -:10A390000711000003008000200000000000000002 -:10A3A000FFFFFF00000000000A8000000000000026 -:10A3B00007120000130080002000000000000000D1 -:10A3C000FFFFFF0000000000088000000000000008 -:10A3D00007130000230080002000000000000000A0 -:10A3E000FFFFFF00000000000A80000000000000E6 -:10A3F0002573202825642F2564290025642F2564D2 -:10A4000000252E2A730000000300000000008000D9 -:10A41000200000000100000000000000FFFFFF001E -:10A420000000000000000000050102000C00040014 -:10A430000700000000000000FFFFFF000000000018 -:10A4400000000000D093D0C005027A000C00040088 -:10A450000700000000000000FFFFFF0000000000F8 -:10A4600000000000F093D0C005103800020010007A -:10A470001000000000000000FFFFFF0000000000CF -:10A480000A80000000000000071100001C0080008E -:10A490002000000000000000FFFFFF00000000009F -:10A4A00008800000000000000300000000008000A1 -:10A4B000200000000100000000000000FFFFFF007E -:10A4C0000000000000000000050102000C00040074 -:10A4D0000700000000000000FFFFFF000000000078 -:10A4E00000000000D093D0C005027A000C000400E8 -:10A4F0000700000000000000FFFFFF000000000058 -:10A5000000000000F093D0C0050F100008001000FC -:10A510001000000000000000FFFFFF00000000002E -:10A520000000000000000000071029000C0080005F -:10A530002000000000000000FFFFFF0000000000FE -:10A540000800000000000000071129001A00800028 -:10A550002000000000000000FFFFFF0000000000DE -:10A560000800000000000000F587D0C0001E002099 -:10A57000000000000000000068A5D0C0FFFFFFFF42 -:10A5800000000000000000000000000000000000CB -:10A5900000000000000000000000000000000000BB -:10A5A00000000000000000000000000000000000AB -:10A5B000000000000000000000000000000000009B -:04000005C0D0000166 -:00000001FF diff --git a/src/qt/res/ledger/nanos_test_delete.txt b/src/qt/res/ledger/nanos_test_delete.txt deleted file mode 100644 index 7fc22c971d..0000000000 --- a/src/qt/res/ledger/nanos_test_delete.txt +++ /dev/null @@ -1 +0,0 @@ -python3 -m ledgerblue.deleteApp --targetId 0x31100004 --appName "Qtum Test" --rootPrivateKey fea057826208738ba33ff0e1ebb8ebf682ab73753afb2d988df03b1b59187d58 diff --git a/src/qt/res/ledger/nanos_test_load.txt b/src/qt/res/ledger/nanos_test_load.txt deleted file mode 100644 index 029b5e97fd..0000000000 --- a/src/qt/res/ledger/nanos_test_load.txt +++ /dev/null @@ -1 +0,0 @@ -python3 -m ledgerblue.loadApp --curve secp256k1 --tlv --targetId 0x31100004 --targetVersion="1.6.1" --delete --fileName :/ledger/nanos_test_app --appName "Qtum Test" --appVersion 1.5.3 --dataSize 64 --icon 010000000000ffffffffffffffffff1ffc0ff847f1a7f247f1a7f247f10ff01fe0fff7ffffffffffff --rootPrivateKey fea057826208738ba33ff0e1ebb8ebf682ab73753afb2d988df03b1b59187d58 --path "" --path "44'/1'" --path "45'/1'" --path "48'/1'" --path "49'/1'" --path "84'/1'" --path "0'/45342'" --path "20698'/3053'/12648430'" --appFlags 0xa50 diff --git a/src/qt/walletframe.cpp b/src/qt/walletframe.cpp index 974829fa92..db84d775eb 100644 --- a/src/qt/walletframe.cpp +++ b/src/qt/walletframe.cpp @@ -335,10 +335,3 @@ void WalletFrame::signTxHardware(const QString& tx) if (walletView) walletView->signTxHardware(tx); } - -void WalletFrame::setupLedger() -{ - WalletView *walletView = currentWalletView(); - if (walletView) - walletView->setupLedger(); -} diff --git a/src/qt/walletframe.h b/src/qt/walletframe.h index abcb2a74cb..54096e642c 100644 --- a/src/qt/walletframe.h +++ b/src/qt/walletframe.h @@ -107,8 +107,6 @@ public Q_SLOTS: void lockWallet(); /** Sign transaction with hardware wallet*/ void signTxHardware(const QString& tx = ""); - /** Setup ledger hardware wallet application*/ - void setupLedger(); /** Show used sending addresses */ void usedSendingAddresses(); diff --git a/src/qt/walletview.cpp b/src/qt/walletview.cpp index a9a16363ab..9f78f7e89f 100644 --- a/src/qt/walletview.cpp +++ b/src/qt/walletview.cpp @@ -28,7 +28,6 @@ #include #include #include -#include #include #include @@ -482,9 +481,3 @@ void WalletView::signTxHardware(const QString &tx) dlg.setModel(walletModel); dlg.exec(); } - -void WalletView::setupLedger() -{ - QtumLedgerInstallerDialog dlg(this); - dlg.exec(); -} diff --git a/src/qt/walletview.h b/src/qt/walletview.h index 9d31ca7025..00aaa37d28 100644 --- a/src/qt/walletview.h +++ b/src/qt/walletview.h @@ -140,8 +140,6 @@ public Q_SLOTS: void lockWallet(); /** Sign transaction with hardware wallet*/ void signTxHardware(const QString& tx = ""); - /** Setup ledger hardware wallet application*/ - void setupLedger(); /** Show used sending addresses */ void usedSendingAddresses(); From 40e79f0c4a6486bc8fd03c98f862e2f1362ba932 Mon Sep 17 00:00:00 2001 From: Neil Date: Sun, 24 Oct 2021 23:29:24 +0100 Subject: [PATCH 146/164] Add missing include QRegularExpressionValidator --- src/qt/derivationpathdialog.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/qt/derivationpathdialog.cpp b/src/qt/derivationpathdialog.cpp index e4835b3be0..444a6a7b54 100644 --- a/src/qt/derivationpathdialog.cpp +++ b/src/qt/derivationpathdialog.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #define paternDerivationPath "^m/[0-9]{1,9}'/[0-9]{1,9}'/[0-9]{1,9}'$" QString toHWIPath(const QString& path) From cea80eb6acd2cbcd6a17960385556fac93c68d39 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 12 Nov 2021 15:33:59 +0100 Subject: [PATCH 147/164] Fix chain selection for upstream hwi --- src/qtum/qtumledger.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/qtum/qtumledger.cpp b/src/qtum/qtumledger.cpp index 932348339a..dbdfca435a 100644 --- a/src/qtum/qtumledger.cpp +++ b/src/qtum/qtumledger.cpp @@ -186,10 +186,11 @@ class QtumLedgerPriv if(gArgs.GetChainName() != CBaseChainParams::MAIN) { - arguments << "--testnet"; ledgerMainPath = false; } + arguments << "--chain" << gArgs.GetChainName(); + if(!toolExists) { LogPrintf("QtumLedger(): HWI tool not found %s\n", toolPath); From 7b00ba70b956e82250fff834d34e9d90d3030cd3 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Fri, 12 Nov 2021 16:32:03 +0100 Subject: [PATCH 148/164] Fix address selection for upstream hwi --- src/qtum/qtumledger.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/qtum/qtumledger.cpp b/src/qtum/qtumledger.cpp index dbdfca435a..2d8214ee27 100644 --- a/src/qtum/qtumledger.cpp +++ b/src/qtum/qtumledger.cpp @@ -549,10 +549,13 @@ bool QtumLedger::beginGetKeyPool(const std::string &fingerprint, int type, const std::string descType; switch (type) { case (int)OutputType::P2SH_SEGWIT: - descType = "--sh_wpkh"; + descType = "sh_wit"; break; case (int)OutputType::BECH32: - descType = "--wpkh"; + descType = "wit"; + break; + case (int)OutputType::LEGACY: + descType = "legacy"; break; default: break; @@ -562,7 +565,7 @@ bool QtumLedger::beginGetKeyPool(const std::string &fingerprint, int type, const std::vector arguments = d->arguments; arguments << "-f" << fingerprint << "getkeypool"; if(descType != "") - arguments << descType; + arguments << "--addr-type" << descType; if(path != "") { arguments << "--path" << path; From 34495e59b107d53e5613aa6b3f3860073546747d Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Thu, 18 Nov 2021 11:21:14 +0100 Subject: [PATCH 149/164] Add ledger icon --- src/Makefile.qt.include | 4 +++- src/qt/bitcoin.qrc | 2 ++ src/qt/res/icons/ledger_off.png | Bin 0 -> 495 bytes src/qt/res/icons/ledger_on.png | Bin 0 -> 415 bytes 4 files changed, 5 insertions(+), 1 deletion(-) create mode 100755 src/qt/res/icons/ledger_off.png create mode 100755 src/qt/res/icons/ledger_on.png diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index a411b6bd62..2658d5016f 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -385,7 +385,9 @@ RES_ICONS = \ qt/res/icons/plus_full.png \ qt/res/icons/split.png \ qt/res/icons/delegate.png \ - qt/res/icons/superstake.png + qt/res/icons/superstake.png \ + qt/res/icons/ledger_on.png \ + qt/res/icons/ledger_off.png BITCOIN_QT_BASE_CPP = \ qt/bantablemodel.cpp \ diff --git a/src/qt/bitcoin.qrc b/src/qt/bitcoin.qrc index ac8d782abe..6bb1677877 100644 --- a/src/qt/bitcoin.qrc +++ b/src/qt/bitcoin.qrc @@ -71,6 +71,8 @@ res/icons/delegate.png res/icons/split.png res/icons/superstake.png + res/icons/ledger_on.png + res/icons/ledger_off.png res/movies/spinner-000.png diff --git a/src/qt/res/icons/ledger_off.png b/src/qt/res/icons/ledger_off.png new file mode 100755 index 0000000000000000000000000000000000000000..46fe3cdeb068129af1f3f7fd5b01504d743a0ef2 GIT binary patch literal 495 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdoh8VBF^E;uumf=k4r^d4~*mTn}&2 zPyGMC_k)4e#+6I^)=$28yI4h~MP$0n&Lf4+*+6X|@cdDb$aA$gZKFDtPk-!>e*ACx zQES@!`C>l<3kumU6`$lPnY4YvtjUuaFBCD!Zq8p=otLtJgUMAuqsc*#rAr}zrBR7P zIDS?&e8a>`hF(sd!UiS3rrSW%GfBZ_U#iL!V2;TNQ~$)N+(up1k-#pn67l?9Qo% zftB%Zqfb2jXeWDHm-#!(yR+M?Yup}mgswGz7PThau2V$XO2_YgTQYWyc%VtR;N6$_MG!G*6aHrZ|@8<+nG~O9{Mn&{L~_@ zW!pEO+tzVMZvFF5Pkw!=G|!W~aqG#neTxrVt5^}j)Nk7T;9!-Yb6*)S{Fm%xj{9sf UA$c9sFHm%Ny85}Sb4q9e03*NFc>n+a literal 0 HcmV?d00001 diff --git a/src/qt/res/icons/ledger_on.png b/src/qt/res/icons/ledger_on.png new file mode 100755 index 0000000000000000000000000000000000000000..47268956b8ba6e7e1ab89d6438ed1b7083cf7bbf GIT binary patch literal 415 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdoh8U`+FLaSW-L^Y*s4P?LiI%f*8q z{)Jx?S7-#4kqK3ARhdj9q63i1DgYiieXpWn3af58d& zLnmch)~iZg(7dNr;(Ll^(Geyqzx%H~Z8dCEV(Q}1P+HK@0A*-wnlWK(Q*tAxh+u$= zgCL_T3y>kQv$t~{d(^#u1{mr+?#7s`{_9&?vH3tO)4wV%E_+o=_MA^IUi^~0@n+}k zT&CIj5fSSq%=z)X`%%zjYnC;;{ydX0$d-S6-EAG?X7k2*Wkoy@+3arAtJ$zy3}3P(>@KbLh*2~7Z`!maTD literal 0 HcmV?d00001 From 2359e515a16c54c4af44b3a21a58a8fff5e70d9e Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 22 Nov 2021 10:14:17 +0100 Subject: [PATCH 150/164] Change ledger id label --- src/qt/forms/optionsdialog.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/forms/optionsdialog.ui b/src/qt/forms/optionsdialog.ui index d75c396d98..edd6aa416b 100644 --- a/src/qt/forms/optionsdialog.ui +++ b/src/qt/forms/optionsdialog.ui @@ -271,7 +271,7 @@ - Stake Ledger ID + Select Ledger device for staking From 244a3e84091051b0316a7cf219c6055c6ed1f48c Mon Sep 17 00:00:00 2001 From: Toni Markov Date: Mon, 22 Nov 2021 11:00:34 +0100 Subject: [PATCH 151/164] Add ledger icon in gui --- src/qt/bitcoingui.cpp | 9 +++++++++ src/qt/bitcoingui.h | 3 +++ 2 files changed, 12 insertions(+) diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index acb017a412..53ae634d11 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -161,6 +161,7 @@ BitcoinGUI::BitcoinGUI(interfaces::Node& node, const PlatformStyle *_platformSty frameBlocksLayout->setSpacing(10); unitDisplayControl = new UnitDisplayStatusBarControl(platformStyle); unitDisplayControl->setObjectName("unitDisplayControl"); + labelLedgerIcon = new QLabel(); labelWalletEncryptionIcon = new QLabel(); labelWalletHDStatusIcon = new QLabel(); labelProxyIcon = new GUIUtil::ClickableLabel(); @@ -175,6 +176,7 @@ BitcoinGUI::BitcoinGUI(interfaces::Node& node, const PlatformStyle *_platformSty hLayUnit->addWidget(unitDisplayControl); hLayUnit->addStretch(); frameBlocksLayout->addLayout(hLayUnit); + hLayIcons->addWidget(labelLedgerIcon); hLayIcons->addWidget(labelWalletEncryptionIcon); hLayIcons->addWidget(labelWalletHDStatusIcon); } @@ -188,6 +190,8 @@ BitcoinGUI::BitcoinGUI(interfaces::Node& node, const PlatformStyle *_platformSty addDockWindows(Qt::LeftDockWidgetArea, frameBlocks); #ifdef ENABLE_WALLET + updateLedgerIcon(); + if (gArgs.GetBoolArg("-staking", true)) { QTimer *timerStakingIcon = new QTimer(labelStakingIcon); @@ -1548,6 +1552,11 @@ void BitcoinGUI::toggleHidden() } #ifdef ENABLE_WALLET +void BitcoinGUI::updateLedgerIcon() +{ + labelLedgerIcon->setPixmap(platformStyle->MultiStatesIcon(":/icons/ledger_on").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE)); +} + void BitcoinGUI::updateStakingIcon() { if(m_node.shutdownRequested() || !clientModel || clientModel->fBatchProcessingMode) diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h index af9734d568..0e59c7d070 100644 --- a/src/qt/bitcoingui.h +++ b/src/qt/bitcoingui.h @@ -122,6 +122,7 @@ class BitcoinGUI : public QMainWindow WalletFrame* walletFrame = nullptr; UnitDisplayStatusBarControl* unitDisplayControl = nullptr; + QLabel *labelLedgerIcon = nullptr; QLabel* labelWalletEncryptionIcon = nullptr; QLabel* labelWalletHDStatusIcon = nullptr; GUIUtil::ClickableLabel* labelProxyIcon = nullptr; @@ -349,6 +350,8 @@ public Q_SLOTS: /** Simply calls showNormalIfMinimized(true) for use in SLOT() macro */ void toggleHidden(); #ifdef ENABLE_WALLET + /** Update ledger icon **/ + void updateLedgerIcon(); /** Update staking icon **/ void updateStakingIcon(); #endif // ENABLE_WALLET From e3de3fafc088801d6f21faf9dc137e64a71067af Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 22 Nov 2021 12:22:43 +0100 Subject: [PATCH 152/164] Add ledger app name --- src/miner.cpp | 2 +- src/qt/hardwarekeystoredialog.cpp | 10 +++++----- src/qt/hardwarekeystoredialog.h | 6 ++++-- src/qt/hardwaresigntx.cpp | 2 +- src/qt/qtumhwitool.cpp | 11 ++++++----- src/qt/qtumhwitool.h | 7 +++++-- src/qt/walletcontroller.cpp | 2 +- src/qt/walletmodel.cpp | 2 +- src/qtum/qtumledger.cpp | 17 +++++++++++------ src/qtum/qtumledger.h | 9 ++++++--- 10 files changed, 41 insertions(+), 27 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index 3c7c28a2ac..7a2c17b8e4 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -1865,7 +1865,7 @@ class StakeMiner : public IStakeMiner return false; QtumLedger &device = QtumLedger::instance(); - bool fConnected = device.isConnected(ledgerId); + bool fConnected = device.isConnected(ledgerId, true); if(!fConnected) { d->pwallet->m_last_coin_stake_search_interval = 0; diff --git a/src/qt/hardwarekeystoredialog.cpp b/src/qt/hardwarekeystoredialog.cpp index 753d5606dc..fc8cc67e03 100644 --- a/src/qt/hardwarekeystoredialog.cpp +++ b/src/qt/hardwarekeystoredialog.cpp @@ -64,13 +64,13 @@ void HardwareKeystoreDialog::setCurrentIndex(int index) } } -bool HardwareKeystoreDialog::SelectDevice(QString &fingerprint, QString& errorMessage, bool& canceled, QWidget *parent) +bool HardwareKeystoreDialog::SelectDevice(QString &fingerprint, QString& errorMessage, bool& canceled, bool stake, QWidget *parent) { // Enumerate devices QtumHwiTool hwiTool(parent); QList devices; canceled = false; - if(hwiTool.enumerate(devices)) + if(hwiTool.enumerate(devices, stake)) { // Get valid devices QStringList listDeviceKey; @@ -112,18 +112,18 @@ bool HardwareKeystoreDialog::SelectDevice(QString &fingerprint, QString& errorM return false; } -bool HardwareKeystoreDialog::AskDevice(QString &fingerprint, const QString &title, const QString &message, QWidget *parent) +bool HardwareKeystoreDialog::AskDevice(QString &fingerprint, const QString &title, const QString &message, bool stake, QWidget *parent) { QString errorMessage; bool canceled = false; - if(SelectDevice(fingerprint, errorMessage, canceled, parent)) + if(SelectDevice(fingerprint, errorMessage, canceled, stake, parent)) return true; QMessageBox box(QMessageBox::Question, title, message, QMessageBox::No | QMessageBox::Yes, parent); while(!canceled && box.exec() == QMessageBox::Yes) { - if(SelectDevice(fingerprint, errorMessage, canceled, parent)) + if(SelectDevice(fingerprint, errorMessage, canceled, stake, parent)) return true; } return false; diff --git a/src/qt/hardwarekeystoredialog.h b/src/qt/hardwarekeystoredialog.h index 82aa55616e..9fd85cef01 100644 --- a/src/qt/hardwarekeystoredialog.h +++ b/src/qt/hardwarekeystoredialog.h @@ -48,19 +48,21 @@ class HardwareKeystoreDialog : public QDialog * @param fingerprint Fingerprint of the selected device * @param errorMessage Error message during device selection * @param canceled Device selection canceled by the user + * @param stake Is stake app * @param parent Parent widget * @return true: device selected; false: device not selected */ - static bool SelectDevice(QString& fingerprint, QString& errorMessage, bool& canceled, QWidget *parent = 0); + static bool SelectDevice(QString& fingerprint, QString& errorMessage, bool& canceled, bool stake, QWidget *parent = 0); /** * @brief AskDevice Ask for hardware keystore device * @param fingerprint Fingerprint of the device * @param title Title of the message box to display * @param message Message to display to the user + * @param stake Is stake app * @return true: device selected; false: device not selected */ - static bool AskDevice(QString& fingerprint, const QString& title, const QString& message, QWidget *parent = 0); + static bool AskDevice(QString& fingerprint, const QString& title, const QString& message, bool stake, QWidget *parent = 0); private Q_SLOTS: void on_cancelButton_clicked(); diff --git a/src/qt/hardwaresigntx.cpp b/src/qt/hardwaresigntx.cpp index 061b2f4865..0f619de3e1 100644 --- a/src/qt/hardwaresigntx.cpp +++ b/src/qt/hardwaresigntx.cpp @@ -46,7 +46,7 @@ bool HardwareSignTx::askDevice(bool stake, QString* pFingerprint) QString fingerprint = model ? model->getFingerprint(stake) : ""; QString title = tr("Connect Ledger"); QString message = tr("Please insert your Ledger (%1). Verify the cable is connected and that no other application is using it.\n\nTry to connect again?"); - if(HardwareKeystoreDialog::AskDevice(fingerprint, title, message.arg(fingerprint))) + if(HardwareKeystoreDialog::AskDevice(fingerprint, title, message.arg(fingerprint), stake)) { if(pFingerprint) *pFingerprint = fingerprint; if(model) model->setFingerprint(fingerprint, stake); diff --git a/src/qt/qtumhwitool.cpp b/src/qt/qtumhwitool.cpp index 77f6eebad9..ee427f4aee 100644 --- a/src/qt/qtumhwitool.cpp +++ b/src/qt/qtumhwitool.cpp @@ -73,7 +73,7 @@ HWDevice::HWDevice() QString HWDevice::toString() const { - return QString("[ %1 \\ %2 \\ %3 ]").arg(type, model, fingerprint); + return QString("[ %1 \\ %2 \\ %3 \\ %4 ]").arg(type, model, fingerprint, app_name); } bool HWDevice::isValid() const @@ -96,6 +96,7 @@ HWDevice toHWDevice(const LedgerDevice& device) hwDevice.error = QString::fromStdString(device.error); hwDevice.model = QString::fromStdString(device.model); hwDevice.code = QString::fromStdString(device.code); + hwDevice.app_name = QString::fromStdString(device.app_name); return hwDevice; } @@ -109,12 +110,12 @@ QtumHwiTool::~QtumHwiTool() delete d; } -bool QtumHwiTool::enumerate(QList &devices) +bool QtumHwiTool::enumerate(QList &devices, bool stake) { LOCK(cs_ledger); devices.clear(); std::vector vecDevices; - if(QtumLedger::instance().enumerate(vecDevices)) + if(QtumLedger::instance().enumerate(vecDevices, stake)) { for(LedgerDevice device : vecDevices) { @@ -135,11 +136,11 @@ bool QtumHwiTool::enumerate(QList &devices) return devices.size() > 0; } -bool QtumHwiTool::isConnected(const QString &fingerprint) +bool QtumHwiTool::isConnected(const QString &fingerprint, bool stake) { LOCK(cs_ledger); std::string strFingerprint = fingerprint.toStdString(); - bool ret = QtumLedger::instance().isConnected(strFingerprint); + bool ret = QtumLedger::instance().isConnected(strFingerprint, stake); if(!ret) d->strError = QString::fromStdString(QtumLedger::instance().errorMessage()); return ret; } diff --git a/src/qt/qtumhwitool.h b/src/qt/qtumhwitool.h index c3d29d6da4..2d57d2d48c 100644 --- a/src/qt/qtumhwitool.h +++ b/src/qt/qtumhwitool.h @@ -48,6 +48,7 @@ class HWDevice QString error; QString model; QString code; + QString app_name; }; /** @@ -71,16 +72,18 @@ class QtumHwiTool : public QObject /** * @brief enumerate Enumerate hardware wallet devices * @param devices List of devices + * @param stake Is stake app * @return success of the operation */ - bool enumerate(QList& devices); + bool enumerate(QList& devices, bool stake); /** * @brief isConnected Check if a device is connected * @param fingerprint Hardware wallet device fingerprint + * @param stake Is stake app * @return success of the operation */ - bool isConnected(const QString& fingerprint); + bool isConnected(const QString& fingerprint, bool stake); /** * @brief getKeyPool Get the key pool for a device diff --git a/src/qt/walletcontroller.cpp b/src/qt/walletcontroller.cpp index 2f4d0080e8..5a0443c463 100644 --- a/src/qt/walletcontroller.cpp +++ b/src/qt/walletcontroller.cpp @@ -223,7 +223,7 @@ void CreateWalletActivity::askDevice() { QString errorMessage; bool canceled = false; - if(HardwareKeystoreDialog::SelectDevice(m_fingerprint, errorMessage, canceled, m_parent_widget)) + if(HardwareKeystoreDialog::SelectDevice(m_fingerprint, errorMessage, canceled, false, m_parent_widget)) { createWallet(); } diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index 2cceb0179a..507d39f179 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -875,7 +875,7 @@ void WalletModel::checkHardwareWallet() QString errorMessage; bool error = false; - if(hwiTool.isConnected(fingerprint)) + if(hwiTool.isConnected(fingerprint, false)) { // Setup key pool if(importPKH) diff --git a/src/qtum/qtumledger.cpp b/src/qtum/qtumledger.cpp index 2d8214ee27..70459d0bb5 100644 --- a/src/qtum/qtumledger.cpp +++ b/src/qtum/qtumledger.cpp @@ -292,11 +292,11 @@ bool QtumLedger::signBlockHeader(const std::string &fingerprint, const std::stri return endSignBlockHeader(fingerprint, header, path, vchSig); } -bool QtumLedger::isConnected(const std::string &fingerprint) +bool QtumLedger::isConnected(const std::string &fingerprint, bool stake) { // Check if a device is connected std::vector devices; - if(enumerate(devices)) + if(enumerate(devices, stake)) { for(LedgerDevice device: devices) { @@ -308,7 +308,7 @@ bool QtumLedger::isConnected(const std::string &fingerprint) return false; } -bool QtumLedger::enumerate(std::vector &devices) +bool QtumLedger::enumerate(std::vector &devices, bool stake) { LOCK(cs_ledger); // Check if tool exists @@ -324,7 +324,7 @@ bool QtumLedger::enumerate(std::vector &devices) wait(); - return endEnumerate(devices); + return endEnumerate(devices, stake); } bool QtumLedger::signTx(const std::string &fingerprint, std::string &psbt) @@ -490,7 +490,7 @@ bool QtumLedger::beginEnumerate(std::vector &) return d->fStarted; } -bool QtumLedger::endEnumerate(std::vector &devices) +bool QtumLedger::endEnumerate(std::vector &devices, bool stake) { // Decode command line results UniValue jsonDocument = json_read_doc(d->strStdout); @@ -511,7 +511,12 @@ bool QtumLedger::endEnumerate(std::vector &devices) device.error = json_get_key_string(data, "error"); device.model = json_get_key_string(data, "model"); device.code = json_get_key_string(data, "code"); - devices.push_back(device); + device.app_name = json_get_key_string(data, "app_name"); + bool isStakeApp = device.app_name == "Qtum Stake" || device.app_name == "Qtum Stake Test"; + if(isStakeApp == stake) + { + devices.push_back(device); + } } return devices.size() > 0; diff --git a/src/qtum/qtumledger.h b/src/qtum/qtumledger.h index a764a68dd3..14d2ab0e04 100644 --- a/src/qtum/qtumledger.h +++ b/src/qtum/qtumledger.h @@ -19,6 +19,7 @@ struct LedgerDevice std::string error; std::string model; std::string code; + std::string app_name; }; /** @@ -58,16 +59,18 @@ class QtumLedger { /** * @brief isConnected Check if a device is connected * @param fingerprint Hardware wallet device fingerprint + * @param stake Is stake app * @return success of the operation */ - bool isConnected(const std::string& fingerprint); + bool isConnected(const std::string& fingerprint, bool stake); /** * @brief enumerate Enumerate hardware wallet devices * @param devices List of devices + * @param stake Is stake app * @return success of the operation */ - bool enumerate(std::vector& devices); + bool enumerate(std::vector& devices, bool stake); /** * @brief signTx Sign PSBT transaction @@ -137,7 +140,7 @@ class QtumLedger { bool endSignBlockHeader(const std::string& fingerprint, const std::string& header, const std::string& path, std::vector& vchSig); bool beginEnumerate(std::vector& devices); - bool endEnumerate(std::vector& devices); + bool endEnumerate(std::vector& devices, bool stake); bool beginSignMessage(const std::string& fingerprint, const std::string& message, const std::string& path, std::string &signature); bool endSignMessage(const std::string& fingerprint, const std::string& message, const std::string& path, std::string &signature); From 3d30aaee75643db265956fe1b3288f387b1ef764 Mon Sep 17 00:00:00 2001 From: Toni Markov Date: Mon, 22 Nov 2021 12:49:39 +0100 Subject: [PATCH 153/164] Implement update ledger icon --- src/qt/bitcoingui.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 53ae634d11..f6ecec285c 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -190,6 +190,10 @@ BitcoinGUI::BitcoinGUI(interfaces::Node& node, const PlatformStyle *_platformSty addDockWindows(Qt::LeftDockWidgetArea, frameBlocks); #ifdef ENABLE_WALLET + QTimer *timerLedgerIcon = new QTimer(labelLedgerIcon); + connect(timerLedgerIcon, SIGNAL(timeout()), this, SLOT(updateLedgerIcon())); + timerLedgerIcon->start(30 * 1000); + updateLedgerIcon(); if (gArgs.GetBoolArg("-staking", true)) @@ -1554,7 +1558,20 @@ void BitcoinGUI::toggleHidden() #ifdef ENABLE_WALLET void BitcoinGUI::updateLedgerIcon() { - labelLedgerIcon->setPixmap(platformStyle->MultiStatesIcon(":/icons/ledger_on").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE)); + WalletView * const walletView = walletFrame ? walletFrame->currentWalletView() : 0; + + if (!walletView) { + labelLedgerIcon->setPixmap(platformStyle->MultiStatesIcon(":/icons/ledger_off").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE)); + return; + } + WalletModel * const walletModel = walletView->getWalletModel(); + + if(walletModel->getFingerprint() == ""){ + labelLedgerIcon->setPixmap(platformStyle->MultiStatesIcon(":/icons/ledger_off").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE)); + } + else{ + labelLedgerIcon->setPixmap(platformStyle->MultiStatesIcon(":/icons/ledger_on").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE)); + } } void BitcoinGUI::updateStakingIcon() From def284121db008d225f6d7b5d381b6171ceff805 Mon Sep 17 00:00:00 2001 From: timemarkovqtum Date: Mon, 22 Nov 2021 15:24:30 +0100 Subject: [PATCH 154/164] Add check for hardware device --- src/qt/bitcoingui.cpp | 44 +++++++++++++++++++++++++++------ src/qt/guiconstants.h | 3 +++ src/qt/walletmodel.cpp | 55 ++++++++++++++++++++++++++++++++++++++++++ src/qt/walletmodel.h | 6 +++++ 4 files changed, 101 insertions(+), 7 deletions(-) diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index f6ecec285c..4b63d0c5d3 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -179,9 +179,9 @@ BitcoinGUI::BitcoinGUI(interfaces::Node& node, const PlatformStyle *_platformSty hLayIcons->addWidget(labelLedgerIcon); hLayIcons->addWidget(labelWalletEncryptionIcon); hLayIcons->addWidget(labelWalletHDStatusIcon); + hLayIcons->addWidget(labelStakingIcon); } hLayIcons->addWidget(labelProxyIcon); - hLayIcons->addWidget(labelStakingIcon); hLayIcons->addWidget(connectionsControl); hLayIcons->addWidget(labelBlocksIcon); hLayIcons->addStretch(); @@ -192,7 +192,7 @@ BitcoinGUI::BitcoinGUI(interfaces::Node& node, const PlatformStyle *_platformSty #ifdef ENABLE_WALLET QTimer *timerLedgerIcon = new QTimer(labelLedgerIcon); connect(timerLedgerIcon, SIGNAL(timeout()), this, SLOT(updateLedgerIcon())); - timerLedgerIcon->start(30 * 1000); + timerLedgerIcon->start(1000); updateLedgerIcon(); @@ -204,6 +204,10 @@ BitcoinGUI::BitcoinGUI(interfaces::Node& node, const PlatformStyle *_platformSty updateStakingIcon(); } + else + { + labelStakingIcon->setVisible(false); + } #endif // ENABLE_WALLET // Progress bar and label for blocks download @@ -1558,19 +1562,45 @@ void BitcoinGUI::toggleHidden() #ifdef ENABLE_WALLET void BitcoinGUI::updateLedgerIcon() { + if(m_node.shutdownRequested() || !clientModel || clientModel->fBatchProcessingMode) + return; + WalletView * const walletView = walletFrame ? walletFrame->currentWalletView() : 0; if (!walletView) { - labelLedgerIcon->setPixmap(platformStyle->MultiStatesIcon(":/icons/ledger_off").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE)); + labelLedgerIcon->setVisible(false); return; } + WalletModel * const walletModel = walletView->getWalletModel(); + if(!walletModel) { + labelLedgerIcon->setVisible(false); + return; + } - if(walletModel->getFingerprint() == ""){ - labelLedgerIcon->setPixmap(platformStyle->MultiStatesIcon(":/icons/ledger_off").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE)); + if(walletModel->wallet().privateKeysDisabled()) + { + labelLedgerIcon->setVisible(true); + QList devices = walletModel->getDevices(); + if(devices.count() > 0){ + labelLedgerIcon->setPixmap(platformStyle->MultiStatesIcon(":/icons/ledger_on").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE)); + QString toolTipStr; + for(int i = 0; i < devices.count(); i++) + { + HWDevice device = devices[i]; + if(i > 0) toolTipStr += "

"; + toolTipStr += tr("Device connected.
Type is %1
Model is %2
Fingerprint is %3
App name is %4").arg(device.type, device.model, device.fingerprint, device.app_name); + } + labelLedgerIcon->setToolTip(toolTipStr); + } + else{ + labelLedgerIcon->setPixmap(platformStyle->MultiStatesIcon(":/icons/ledger_off").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE)); + labelLedgerIcon->setToolTip(tr("Device not connected")); + } } - else{ - labelLedgerIcon->setPixmap(platformStyle->MultiStatesIcon(":/icons/ledger_on").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE)); + else + { + labelLedgerIcon->setVisible(false); } } diff --git a/src/qt/guiconstants.h b/src/qt/guiconstants.h index 89778addf6..3565e07376 100644 --- a/src/qt/guiconstants.h +++ b/src/qt/guiconstants.h @@ -10,6 +10,9 @@ /* Milliseconds between model updates */ static const int MODEL_UPDATE_DELAY = 2000; +/* Milliseconds between device updates */ +static const int DEVICE_UPDATE_DELAY = 10000; + /* AskPassphraseDialog -- Maximum passphrase length */ static const int MAX_PASSPHRASE_SIZE = 1024; diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index 507d39f179..96b2d06686 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -60,6 +60,7 @@ private Q_SLOTS: walletModel->checkHardwareWallet(); walletModel->checkCoinAddressesChanged(); walletModel->checkStakeWeightChanged(); + walletModel->checkHardwareDevice(); } }; @@ -989,3 +990,57 @@ bool WalletModel::hasLedgerProblem() wallet().getEnabledStaking() && !getFingerprint(true).isEmpty(); } + +QList WalletModel::getDevices() +{ + return devices; +} + +void WalletModel::checkHardwareDevice() +{ + int64_t time = GetTimeMillis(); + if(time > (DEVICE_UPDATE_DELAY + deviceTime)) + { + QList tmpDevices; + QtumHwiTool hwiTool(this); + hwiTool.setModel(this); + + // Get stake device + QString fingerprint_stake = getFingerprint(true); + if(!fingerprint_stake.isEmpty()) + { + QList _devices; + if(hwiTool.enumerate(_devices, true)) + { + for(HWDevice device : _devices) + { + if(device.isValid() && device.fingerprint == fingerprint_stake) + { + tmpDevices.push_back(device); + } + } + } + } + + // Get not stake device + QString fingerprint_not_stake = getFingerprint(); + if(!fingerprint_not_stake.isEmpty()) + { + QList _devices; + if(hwiTool.enumerate(_devices, false)) + { + for(HWDevice device : _devices) + { + if(device.isValid() && device.fingerprint == fingerprint_not_stake) + { + tmpDevices.push_back(device); + } + } + } + } + + // Set update time + deviceTime = GetTimeMillis(); + devices = tmpDevices; + } +} diff --git a/src/qt/walletmodel.h b/src/qt/walletmodel.h index 3212236c4e..d3375083e5 100644 --- a/src/qt/walletmodel.h +++ b/src/qt/walletmodel.h @@ -13,6 +13,7 @@ #include