diff --git a/.gitignore b/.gitignore index 9bab0f8..1bc5714 100644 --- a/.gitignore +++ b/.gitignore @@ -73,3 +73,5 @@ Thumbs.db # gh-pages html /*.ini +/redtimer_plugin_import.cpp +/redtimer_qml_plugin_import.cpp diff --git a/IssueCreator.cpp b/IssueCreator.cpp new file mode 100644 index 0000000..4f24bf3 --- /dev/null +++ b/IssueCreator.cpp @@ -0,0 +1,256 @@ +#include "IssueCreator.h" +#include "IssueSelector.h" +#include "logging.h" + +#include + +using namespace qtredmine; +using namespace redtimer; +using namespace std; + +IssueCreator::IssueCreator( SimpleRedmineClient* redmine, QQuickView* parent ) + : Window( "qrc:/IssueCreator.qml", parent ), + redmine_( redmine ) +{ + ENTER(); + + // Issue selector window initialisation + setResizeMode( QQuickView::SizeRootObjectToView ); + setModality( Qt::ApplicationModal ); + setFlags( Qt::Dialog ); + setTitle( "Issue Creator" ); + + // Load projects + QSortFilterProxyModel* projectProxyModel = new QSortFilterProxyModel(); + projectProxyModel->setSourceModel( &projectModel_ ); + projectProxyModel->setSortRole( SimpleModel::SimpleRoles::IdRole ); + ctx_->setContextProperty( "projectModel", projectProxyModel ); + + loadProjects(); + + // Load trackers + QSortFilterProxyModel* trackerProxyModel = new QSortFilterProxyModel(); + trackerProxyModel->setSourceModel( &trackerModel_ ); + trackerProxyModel->setSortRole( SimpleModel::SimpleRoles::IdRole ); + ctx_->setContextProperty( "trackerModel", trackerProxyModel ); + + loadTrackers(); + + // Connect the project selected signal to the projectSelected slot + connect( qml("project"), SIGNAL(activated(int)), this, SLOT(projectSelected(int)) ); + + // Connect the tracker selected signal to the trackerSelected slot + connect( qml("tracker"), SIGNAL(activated(int)), this, SLOT(trackerSelected(int)) ); + + // Connect the issue selector button + connect( qml("selectParentIssue"), SIGNAL(clicked()), this, SLOT(selectParentIssue()) ); + + // Connect the create button clicked signal to the save slot + connect( qml("create"), SIGNAL(clicked()), this, SLOT(save()) ); + + // Connect the cancel button clicked signal to the close slot + connect( qml("cancel"), SIGNAL(clicked()), this, SLOT(closeWin()) ); + + // Connect the closed signal to the close slot + connect( this, &Window::closed, [=](){ closeWin(); } ); + + RETURN(); +} + +IssueCreator::~IssueCreator() +{ + ENTER(); + RETURN(); +} + +void +IssueCreator::closeWin() +{ + ENTER(); + + if( isVisible() ) + { + DEBUG() << "Closing issue creator window"; + if( cancelOnClose_ ) + cancelled(); + close(); + } + + RETURN(); +} + +void +IssueCreator::display() +{ + ENTER(); + + if( !isVisible() ) + { + DEBUG() << "Displaying issue creator window"; + show(); + } + + RETURN(); +} + +void +IssueCreator::loadProjects() +{ + ENTER(); + + redmine_->retrieveProjects( [&]( Projects projects ) + { + ENTER(); + + projectModel_.clear(); + projectModel_.push_back( SimpleItem(NULL_ID, "Choose project") ); + for( const auto& project : projects ) + projectModel_.push_back( SimpleItem(project) ); + + qml("project")->setProperty( "currentIndex", -1 ); + qml("project")->setProperty( "currentIndex", 0 ); + + RETURN(); + } ); + + RETURN(); +} + +void +IssueCreator::loadTrackers() +{ + ENTER(); + + redmine_->retrieveTrackers( [&]( Trackers trackers ) + { + ENTER(); + + trackerModel_.clear(); + trackerModel_.push_back( SimpleItem(NULL_ID, "Choose tracker") ); + for( const auto& tracker : trackers ) + trackerModel_.push_back( SimpleItem(tracker) ); + + qml("tracker")->setProperty( "currentIndex", -1 ); + qml("tracker")->setProperty( "currentIndex", 0 ); + + RETURN(); + } ); + + RETURN(); +} + +void +IssueCreator::projectSelected( int index ) +{ + ENTER(); + + projectId_ = projectModel_.at(index).id(); + DEBUG()(index)(projectId_); + + RETURN(); +} + +void +IssueCreator::save() +{ + ENTER(); + + if( projectId_ == NULL_ID ) + { + message( "Please select a project", QtCriticalMsg ); + RETURN(); + } + + if( trackerId_ == NULL_ID ) + { + message( "Please select a tracker", QtCriticalMsg ); + RETURN(); + } + + if( qml("subject")->property("text").toString().isEmpty() ) + { + message( "Please specify a subject", QtCriticalMsg ); + RETURN(); + } + + cancelOnClose_ = false; + + Issue issue; + issue.project.id = projectId_; + issue.tracker.id = trackerId_; + + if( !qml("parentIssue")->property("text").toString().isEmpty() ) + issue.parentId = qml("parentIssue")->property("text").toInt(); + + if( !qml("parentIssue")->property("estimatedTime").toString().isEmpty() ) + issue.estimatedHours = qml("estimatedTime")->property("text").toDouble(); + + issue.subject = qml("subject")->property("text").toString(); + issue.description = qml("description")->property("text").toString(); + + redmine_->sendIssue( issue, [=](bool success, int id, RedmineError errorCode, QStringList errors) + { + ENTER()(success)(id)(errorCode)(errors); + + if( !success ) + { + cancelOnClose_ = true; + + QString errorMsg = tr( "Could not create issue." ); + for( const auto& error : errors ) + errorMsg.append("\n").append(error); + + message( errorMsg, QtCriticalMsg ); + RETURN(); + } + + message( tr("New issue created with ID %1").arg(id) ); + + created( id ); + closeWin(); + + RETURN(); + } ); + + RETURN(); +} + +void +IssueCreator::selectParentIssue() +{ + // Issue selector initialisation + IssueSelector* issueSelector = new IssueSelector( redmine_ ); + issueSelector->setTransientParent( this ); + if( projectId_ != NULL_ID ) + issueSelector->setProjectId( projectId_ ); + issueSelector->display(); + + // Connect the issue selected signal to the setIssue slot + connect( issueSelector, &IssueSelector::selected, [=](int issueId) + { + qml("parentIssue")->setProperty( "text", issueId ); + issueSelector->close(); + } ); +} + +void +IssueCreator::setParentIssueId( int id ) +{ + ENTER(); + + if( id != NULL_ID ) + qml("parentIssue")->setProperty( "text", id ); + + RETURN(); +} + +void +IssueCreator::trackerSelected( int index ) +{ + ENTER(); + + trackerId_ = trackerModel_.at(index).id(); + DEBUG()(index)(trackerId_); + + RETURN(); +} diff --git a/IssueCreator.h b/IssueCreator.h new file mode 100644 index 0000000..f4bd63d --- /dev/null +++ b/IssueCreator.h @@ -0,0 +1,120 @@ +#ifndef ISSUECREATOR_H +#define ISSUECREATOR_H + +#include "Models.h" +#include "Window.h" +#include "qtredmine/SimpleRedmineClient.h" + +namespace redtimer { + +/** + * @brief An issue creator for RedTimer + */ +class IssueCreator : public Window +{ + Q_OBJECT + +private: + /// Redmine connection object + qtredmine::SimpleRedmineClient* redmine_ = nullptr; + + /// Emit the cancelled signal upon closing + bool cancelOnClose_ = true; + + /// Current project + int projectId_ = NULL_ID; + + /// Cached projects + SimpleModel projectModel_; + + /// Current tracker + int trackerId_ = NULL_ID; + + /// Cached trackers + SimpleModel trackerModel_; + +private: + /** + * @brief Load and refresh projects in the GUI + */ + void loadProjects(); + + /** + * @brief Load and refresh trackers in the GUI + */ + void loadTrackers(); + +public: + /** + * @brief Constructor for an IssueCreator object + * + * @param redmine Redmine connection object + * @param parent Parent QObject + */ + explicit IssueCreator( qtredmine::SimpleRedmineClient* redmine, QQuickView* parent = nullptr ); + + /** + * @brief Destructor + */ + ~IssueCreator(); + + /// @name Setters + /// @{ + + /** + * @brief Set the parent issue ID + * + * @param id Parent issue ID + */ + void setParentIssueId( int id ); + + /// @} + +public slots: + /** + * @brief Close the issue selector dialog + */ + void closeWin(); + + /** + * @brief Display the issue selector dialog + */ + void display(); + +private slots: + /** + * @brief Slot to a selected project + */ + void projectSelected( int index ); + + /** + * @brief Save the new issue + */ + void save(); + + /** + * @brief Open the issue selector and load issue + */ + void selectParentIssue(); + + /** + * @brief Slot to a selected tracker + */ + void trackerSelected( int index ); + +signals: + /** + * @brief Emitted when the issue creator has been cancelled + */ + void cancelled(); + + /** + * @brief Emitted when an issue has been created + */ + void created( int issueId ); + +}; + +} // redtimer + +#endif // ISSUECREATOR_H diff --git a/IssueCreator.qml b/IssueCreator.qml new file mode 100644 index 0000000..26ac836 --- /dev/null +++ b/IssueCreator.qml @@ -0,0 +1,16 @@ +import QtQuick 2.5 + +Item { + width: 400 + height: 300 + + IssueCreatorForm { + id: issueCreator + + anchors.rightMargin: 0 + anchors.bottomMargin: 0 + anchors.leftMargin: 0 + anchors.topMargin: 0 + anchors.fill: parent + } +} diff --git a/IssueCreatorForm.ui.qml b/IssueCreatorForm.ui.qml new file mode 100644 index 0000000..cb3707b --- /dev/null +++ b/IssueCreatorForm.ui.qml @@ -0,0 +1,132 @@ +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Layouts 1.2 + +Item { + id: issueCreator + objectName: "issueCreator" + + GridLayout { + id: gridLayout1 + anchors.rightMargin: 5 + anchors.leftMargin: 5 + anchors.bottomMargin: 5 + anchors.topMargin: 5 + columns: 2 + anchors.fill: parent + + Label { + id: label6 + text: qsTr("Project") + } + + ComboBox { + id: project + objectName: "project" + Layout.minimumWidth: 200 + Layout.fillWidth: true + model: projectModel + textRole: "name" + } + + Label { + id: label1 + text: qsTr("Tracker") + } + + ComboBox { + id: tracker + objectName: "tracker" + Layout.minimumWidth: 200 + Layout.fillWidth: true + model: trackerModel + textRole: "name" + } + + Label { + id: label2 + text: qsTr("Subject") + } + + TextField { + id: subject + Layout.fillWidth: true + objectName: "subject" + placeholderText: qsTr("") + } + + + Label { + id: label4 + text: qsTr("Parent issue") + } + + RowLayout { + width: 100 + height: 100 + Layout.fillWidth: true + + TextField { + id: parentIssue + Layout.fillWidth: true + objectName: "parentIssue" + placeholderText: qsTr("") + } + + ToolButton { + id: selectParentIssue + objectName: "selectParentIssue" + width: 23 + iconSource: "open-iconic/svg/list.svg" + tooltip: "Select parent issue from list" + } + } + + Label { + id: label5 + text: qsTr("Estimated time") + } + + TextField { + id: estimatedTime + Layout.fillWidth: true + objectName: "estimatedTime" + placeholderText: qsTr("") + } + + Label { + id: label3 + text: qsTr("Description") + } + + TextArea { + id: description + Layout.minimumHeight: 100 + Layout.fillHeight: true + Layout.fillWidth: true + objectName: "description" + } + + RowLayout { + id: rowLayout1 + width: 100 + height: 100 + Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter + Layout.columnSpan: 2 + + Button { + id: create + objectName: "create" + text: qsTr("Create") + isDefault: true + } + + Button { + id: cancel + objectName: "cancel" + text: qsTr("Cancel") + } + } + + } +} diff --git a/IssueSelector.cpp b/IssueSelector.cpp index f3ce0ca..28dcd65 100644 --- a/IssueSelector.cpp +++ b/IssueSelector.cpp @@ -5,29 +5,31 @@ using namespace qtredmine; using namespace redtimer; using namespace std; -IssueSelector::IssueSelector( SimpleRedmineClient* redmine, QObject* parent ) - : QObject( parent ), +IssueSelector::IssueSelector( SimpleRedmineClient* redmine, QQuickView* parent ) + : Window( "qrc:/IssueSelector.qml", parent ), redmine_( redmine ) { ENTER(); // Issue selector window initialisation - win_ = new QQuickView(); - win_->setResizeMode( QQuickView::SizeRootObjectToView ); - win_->setSource( QUrl(QStringLiteral("qrc:/IssueSelector.qml")) ); - win_->setModality( Qt::ApplicationModal ); - win_->setFlags( Qt::Tool ); - - // Issue selector window access members - ctx_ = win_->rootContext(); - item_ = qobject_cast( win_->rootObject() ); + setResizeMode( QQuickView::SizeRootObjectToView ); + setModality( Qt::ApplicationModal ); + setFlags( Qt::Dialog ); + setTitle( "Issue Selector" ); // Set the models issuesProxyModel_.setSourceModel( &issuesModel_ ); + issuesProxyModel_.setSortRole( IssueModel::IssueRoles::IdRole ); + issuesProxyModel_.setDynamicSortFilter( true ); issuesProxyModel_.setFilterCaseSensitivity( Qt::CaseInsensitive ); issuesProxyModel_.setFilterRole( IssueModel::IssueRoles::SubjectRole ); ctx_->setContextProperty( "issuesModel", &issuesProxyModel_ ); - ctx_->setContextProperty( "projectModel", &projectModel_ ); + + QSortFilterProxyModel* projectProxyModel = new QSortFilterProxyModel(); + projectProxyModel->setSourceModel( &projectModel_ ); + projectProxyModel->setSortRole( SimpleModel::SimpleRoles::IdRole ); + projectProxyModel->setDynamicSortFilter( true ); + ctx_->setContextProperty( "projectModel", projectProxyModel ); // Connect the project selected signal to the projectSelected slot connect( qml("project"), SIGNAL(activated(int)), this, SLOT(projectSelected(int)) ); @@ -38,22 +40,6 @@ IssueSelector::IssueSelector( SimpleRedmineClient* redmine, QObject* parent ) // Connect the search accepted signal to the filterIssues slot connect( qml("search"), SIGNAL(textChanged()), this, SLOT(filterIssues()) ); - updateProjects(); - - RETURN(); -} - -void -IssueSelector::close() -{ - ENTER(); - - if( win_->isVisible() ) - { - DEBUG() << "Closing issue selector window"; - win_->close(); - } - RETURN(); } @@ -62,12 +48,12 @@ IssueSelector::display() { ENTER(); - if( !win_->isVisible() ) + if( !isVisible() ) { DEBUG() << "Displaying issue selector window"; - win_->show(); + show(); qml("search")->setProperty( "text", "" ); - updateProjects(); + loadProjects(); } RETURN(); @@ -107,50 +93,51 @@ IssueSelector::projectSelected( int index ) projectId_ = projectModel_.at(index).id(); DEBUG()(index)(projectId_); - updateIssues(); + loadIssues(); RETURN(); } void -IssueSelector::updateIssues() +IssueSelector::loadIssues() { ENTER()(projectId_); - redmine_->retrieveIssues( [=]( Issues issues ) + redmine_->retrieveIssues( [&]( Issues issues ) { ENTER(); - // Sort issues descending by ID - qSort( issues.begin(), issues.end(), - []( const Issue& a, const Issue& b ){ return a.id > b.id; } ); - issuesModel_.clear(); + for( const auto& issue : issues ) issuesModel_.push_back( issue ); DEBUG()(issuesModel_); }, - QString("project_id=%1").arg(projectId_) ); + RedmineOptions( QString("project_id=%1").arg(projectId_), true ) ); + + RETURN(); } void -IssueSelector::updateProjects() +IssueSelector::loadProjects() { ENTER(); - redmine_->retrieveProjects( [&]( Projects projects ) + // Clear and set first item at once and not wait for callback + projectModel_.clear(); + projectModel_.push_back( SimpleItem(NULL_ID, "Choose project") ); + + redmine_->retrieveProjects( [=]( Projects projects ) { ENTER(); int currentIndex = 0; - // Sort issues ascending by name - qSort( projects.begin(), projects.end(), - []( const Project& a, const Project& b ){ return a.name < b.name; } ); - + // Reset in case this has changed since calling loadProjects() projectModel_.clear(); - projectModel_.push_back( SimpleItem("Choose project") ); + projectModel_.push_back( SimpleItem(NULL_ID, "Choose project") ); + for( const auto& project : projects ) { if( project.id == projectId_ ) @@ -161,11 +148,8 @@ IssueSelector::updateProjects() DEBUG()(projectModel_)(currentIndex); - if( currentIndex != 0 ) - { - qml("project")->setProperty( "currentIndex", currentIndex ); - projectSelected( currentIndex ); - } + qml("project")->setProperty( "currentIndex", -1 ); + qml("project")->setProperty( "currentIndex", currentIndex ); RETURN(); } ); @@ -183,19 +167,6 @@ IssueSelector::setProjectId( int id ) { ENTER(); projectId_ = id; + loadIssues(); RETURN(); } - -QQuickItem* -IssueSelector::qml( QString qmlItem ) -{ - ENTER()(qmlItem); - RETURN( item_->findChild(qmlItem) ); -} - -QQuickView* -IssueSelector::window() const -{ - ENTER(); - RETURN( win_ ); -} diff --git a/IssueSelector.h b/IssueSelector.h index 8da8ade..6287243 100644 --- a/IssueSelector.h +++ b/IssueSelector.h @@ -2,13 +2,9 @@ #define ISSUESELECTOR_H #include "Models.h" - +#include "Window.h" #include "qtredmine/SimpleRedmineClient.h" -#include -#include -#include -#include #include namespace redtimer { @@ -16,7 +12,7 @@ namespace redtimer { /** * @brief An issue selector for RedTimer */ -class IssueSelector : public QObject +class IssueSelector : public Window { Q_OBJECT @@ -24,15 +20,6 @@ class IssueSelector : public QObject /// Redmine connection object qtredmine::SimpleRedmineClient* redmine_; - /// Issue selector window object - QQuickView* win_; - - /// Issue selector window context - QQmlContext* ctx_; - - /// Issue selector item object - QQuickItem* item_; - /// List of issues in the GUI IssueModel issuesModel_; QSortFilterProxyModel issuesProxyModel_; @@ -43,23 +30,14 @@ class IssueSelector : public QObject /// List of projects in the GUI SimpleModel projectModel_; - /** - * @brief Get a QML GUI item - * - * @param qmlItem Name of the QML GUI item - * - * @return QML GUI item - */ - QQuickItem* qml( QString qmlItem ); - public: /** - * @brief Constructor for a IssueSelector object + * @brief Constructor for an IssueSelector object * * @param redmine Redmine connection object * @param parent Parent QObject */ - explicit IssueSelector( qtredmine::SimpleRedmineClient* redmine, QObject* parent = nullptr ); + explicit IssueSelector( qtredmine::SimpleRedmineClient* redmine, QQuickView* parent = nullptr ); /// @name Getters /// @{ @@ -93,11 +71,6 @@ class IssueSelector : public QObject /// @} public slots: - /** - * @brief Close the issue selector dialog - */ - void close(); - /** * @brief Display the issue selector dialog */ @@ -122,12 +95,12 @@ private slots: /** * @brief Update issues and refresh issues list */ - void updateIssues(); + void loadIssues(); /** * @brief Update projects and refresh project list */ - void updateProjects(); + void loadProjects(); signals: /** diff --git a/IssueSelectorForm.ui.qml b/IssueSelectorForm.ui.qml index 63f7f1d..cee1573 100644 --- a/IssueSelectorForm.ui.qml +++ b/IssueSelectorForm.ui.qml @@ -12,66 +12,53 @@ Item { property alias project: project property alias search: search - GroupBox { - id: groupBox1 - anchors.rightMargin: 5 - anchors.leftMargin: 5 - anchors.bottomMargin: 5 - anchors.topMargin: 5 + ColumnLayout { + id: columnLayout1 anchors.fill: parent - Layout.alignment: Qt.AlignLeft | Qt.AlignTop - Layout.fillHeight: true - Layout.fillWidth: true - title: qsTr("Issues") - ColumnLayout { - id: columnLayout1 - anchors.fill: parent - - ComboBox { - id: project - Layout.fillWidth: true - objectName: "project" - model: projectModel - textRole: "name" - } - - TextField { - id: search - objectName: "search" - Layout.fillWidth: true - anchors.right: parent.right - anchors.rightMargin: 0 - anchors.left: parent.left - anchors.leftMargin: 0 - placeholderText: qsTr("Search in issue list") - } + ComboBox { + id: project + Layout.fillWidth: true + objectName: "project" + model: projectModel + textRole: "name" + } - ListView { - id: issues - clip: true - boundsBehavior: Flickable.StopAtBounds - Layout.alignment: Qt.AlignLeft | Qt.AlignTop - objectName: "issues" - model: issuesModel + TextField { + id: search + objectName: "search" + Layout.fillWidth: true + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + placeholderText: qsTr("Search in issue list") + } - signal activated( int index ) + ListView { + id: issues + clip: true + boundsBehavior: Flickable.StopAtBounds + Layout.alignment: Qt.AlignLeft | Qt.AlignTop + objectName: "issues" + model: issuesModel - delegate: issueDelegate + signal activated( int index ) - highlight: Rectangle { - color: "lightsteelblue"; - radius: 5 - } + delegate: issueDelegate - Layout.fillWidth: true - Layout.fillHeight: true - anchors.right: parent.right - anchors.rightMargin: 17 - anchors.left: parent.left - anchors.leftMargin: 0 + highlight: Rectangle { + color: "lightsteelblue"; + radius: 5 } + Layout.fillWidth: true + Layout.fillHeight: true + anchors.right: parent.right + anchors.rightMargin: 17 + anchors.left: parent.left + anchors.leftMargin: 0 } + } } diff --git a/Models.cpp b/Models.cpp index 0c60c20..9073a81 100644 --- a/Models.cpp +++ b/Models.cpp @@ -5,31 +5,11 @@ using namespace redtimer; using namespace qtredmine; -SimpleItem::SimpleItem( const QString& name ) - : id_( NULL_ID ), - name_( name ) -{} - SimpleItem::SimpleItem( int id, const QString& name ) : id_( id ), name_( name ) {} -SimpleItem::SimpleItem( const Enumeration& item ) - : id_( item.id ), - name_( item.name ) -{} - -SimpleItem::SimpleItem( const IssueStatus& item ) - : id_( item.id ), - name_( item.name ) -{} - -SimpleItem::SimpleItem( const Project& item ) - : id_( item.id ), - name_( item.name ) -{} - int SimpleItem::id() const { diff --git a/Models.h b/Models.h index 17f5018..27dbe41 100644 --- a/Models.h +++ b/Models.h @@ -22,15 +22,6 @@ class SimpleItem QString name_; public: - /** - * @brief Constructor for a simple item by name - * - * This constructor will set the ID to \c NULL_ID - * - * @param name Name to be set - */ - SimpleItem( const QString& name ); - /** * @brief Constructor for a simple item by ID and name * @@ -40,25 +31,14 @@ class SimpleItem SimpleItem( int id, const QString& name ); /** - * @brief Constructor for a simple item by an enumeration - * - * @param item Enumeration data to be used for the simple item - */ - SimpleItem( const qtredmine::Enumeration& item ); - - /** - * @brief Constructor for a simple item by an issue status - * - * @param item Issue status data to be used for the simple item - */ - SimpleItem( const qtredmine::IssueStatus& item ); - - /** - * @brief Constructor for a simple item by a project + * @brief Constructor for any class containing members \c id and \c name * - * @param item Project data to be used for the simple item + * @param item Class containing members \c id and \c name */ - SimpleItem( const qtredmine::Project& item ); + template + SimpleItem( const T& item ) + : SimpleItem( item.id, item.name ) + {} /// @name /// @{ diff --git a/README.md b/README.md index 3347cdb..306c40c 100644 --- a/README.md +++ b/README.md @@ -41,9 +41,13 @@ This requires for you to have Qt 5.6+ and GCC 4.8.4+ installed and in your path. Alternatively, you can use a QtCreator distribution from https://www.qt.io. In QtCreator, you can open the project files `qtredmine/qtredmine.pro` and `RedTimer.pro` and start the build. +Notes on how to build a statically linked version of Qt 5 with MinGW including OpenSSL support (for HTTPS) can +be found on +https://www.thomssen-it.de/blog/how-to-compile-qt-5-statically-with-mingw-including-openssl-on-windows. + Todo ---- -* Issue creator +* Only display allowed Redmine resources * Cache for offline operation * Spooler for unsaved time entries diff --git a/RedTimer.cpp b/RedTimer.cpp index 119f7e0..2c2f730 100644 --- a/RedTimer.cpp +++ b/RedTimer.cpp @@ -1,3 +1,5 @@ +#include "IssueCreator.h" +#include "IssueSelector.h" #include "RedTimer.h" #include "logging.h" @@ -25,11 +27,15 @@ RedTimer::~RedTimer() // Save settings settings_->setActivity( activityId_ ); - settings_->setIssue( issue_.id ); - settings_->setProject( issueSelector_->getProjectId() ); settings_->setPosition( win_->position() ); settings_->setRecentIssues( recentIssues_.data().toVector() ); + // If currently there is no issue selected, use the first one from the recently opened issues list + if( issue_.id == NULL_ID && recentIssues_.rowCount() ) + settings_->setIssue( recentIssues_.at(0).id ); + else + settings_->setIssue( issue_.id ); + settings_->save(); if( trayIcon_ ) @@ -56,6 +62,7 @@ RedTimer::init() win_->setResizeMode( QQuickView::SizeRootObjectToView ); win_->setSource( QUrl(QStringLiteral("qrc:/RedTimer.qml")) ); win_->setModality( Qt::ApplicationModal ); + win_->setTitle( "RedTimer" ); QPoint position = settings_->getPosition(); if( !position.isNull() ) @@ -78,10 +85,6 @@ RedTimer::init() reconnect(); - // Issue selector initialisation - issueSelector_ = new IssueSelector( redmine_, this ); - issueSelector_->setProjectId( settings_->getProject() ); - // Timer initialisation timer_ = new QTimer( this ); timer_->setTimerType( Qt::VeryCoarseTimer ); @@ -89,61 +92,53 @@ RedTimer::init() // Apply loaded settings activityId_ = settings_->getActivity(); - issueSelector_->setProjectId( settings_->getProject() ); loadIssue( settings_->getIssue(), false ); for( const auto& issue : settings_->getRecentIssues() ) recentIssues_.push_back( issue ); ctx_->setContextProperty( "recentIssuesModel", &recentIssues_ ); + ctx_->setContextProperty( "activityModel", &activityModel_ ); + ctx_->setContextProperty( "issueStatusModel", &issueStatusModel_ ); + // Set transient window parent settings_->window()->setTransientParent( win_ ); - issueSelector_->window()->setTransientParent( win_ ); + + // Connect the create issue button + connect( qml("createIssue"), SIGNAL(clicked()), this, SLOT(createIssue()) ); // Connect the settings button - connect( qml("settings"), SIGNAL(clicked()), - settings_, SLOT(display()) ); + connect( qml("settings"), SIGNAL(clicked()), settings_, SLOT(display()) ); // Connect the reload button - connect( qml("reload"), SIGNAL(clicked()), - this, SLOT(reconnect()) ); + connect( qml("reload"), SIGNAL(clicked()), this, SLOT(reconnect()) ); // Connect the issue selector button - connect( qml("selectIssue"), SIGNAL(clicked()), - issueSelector_, SLOT(display()) ); + connect( qml("selectIssue"), SIGNAL(clicked()), this, SLOT(selectIssue()) ); // Connect the combobox text field - connect( qml("quickPick"), SIGNAL(accepted()), - this, SLOT(loadIssueFromTextField()) ); + connect( qml("quickPick"), SIGNAL(accepted()), this, SLOT(loadIssueFromTextField()) ); // Connect the combobox list - connect( qml("quickPick"), SIGNAL(activated(int)), - this, SLOT(loadIssueFromList(int)) ); + connect( qml("quickPick"), SIGNAL(activated(int)), this, SLOT(loadIssueFromList(int)) ); // Connect the start/stop button - connect( qml("startStop"), SIGNAL(clicked()), - this, SLOT(startStop()) ); + connect( qml("startStop"), SIGNAL(clicked()), this, SLOT(startStop()) ); // Connect the activity selected signal to the activitySelected slot - connect( qml("activity"), SIGNAL(activated(int)), - this, SLOT(activitySelected(int)) ); + connect( qml("activity"), SIGNAL(activated(int)), this, SLOT(activitySelected(int)) ); // Connect the issueStatus selected signal to the issueStatusSelected slot - connect( qml("issueStatus"), SIGNAL(activated(int)), - this, SLOT(issueStatusSelected(int)) ); + connect( qml("issueStatus"), SIGNAL(activated(int)), this, SLOT(issueStatusSelected(int)) ); // Connect the settings saved signal to the reconnect slot connect( settings_, &Settings::applied, this, &RedTimer::reconnect ); - // Connect the issue selected signal to the setIssue slot - connect( issueSelector_, &IssueSelector::selected, - [=](int issueId){ loadIssue(issueId); } ); - // Connect the timer to the tracking counter connect( timer_, &QTimer::timeout, this, &RedTimer::refreshCounter ); // Initially update the GUI - refresh(); + refreshGui(); RETURN(); } @@ -174,7 +169,7 @@ RedTimer::initTrayIcon() bool RedTimer::eventFilter( QObject* obj, QEvent* event ) { - // Show warning on close and if timer is running + // Control closing behaviour depending on tray icon usage if( event->type() == QEvent::Close ) { if( trayIcon_ ) @@ -193,31 +188,92 @@ RedTimer::trayEvent( QSystemTrayIcon::ActivationReason reason ) { ENTER()(reason); - if( reason == QSystemTrayIcon::ActivationReason::DoubleClick ) + if( reason == QSystemTrayIcon::ActivationReason::Trigger ) toggle(); RETURN(); } void -RedTimer::display() +RedTimer::activitySelected( int index ) { ENTER(); - win_->showNormal(); + activityId_ = activityModel_.at(index).id(); + DEBUG()(index)(activityId_); RETURN(); } void -RedTimer::toggle() +RedTimer::addRecentIssue( qtredmine::Issue issue ) +{ + ENTER()(issue); + + // If found, remove the new issue from the list + for( int i = 0; i < recentIssues_.rowCount(); ++i ) + if( recentIssues_.at(i).id == issue.id ) + recentIssues_.removeRow( i ); + + // Add the issue to the top of the list + recentIssues_.push_front( issue ); + + // Crop the list after ten entries (keep 0..9) + int numRecentIssues = settings_->getNumRecentIssues(); + if( numRecentIssues != -1 ) + recentIssues_.removeRowsFrom( numRecentIssues ); + + // Reset the quickPick text field + qml("quickPick")->setProperty( "currentIndex", -1 ); + qml("quickPick")->setProperty( "editText", "" ); + + RETURN(); +} + +void +RedTimer::createIssue() { ENTER(); - if( win_->isVisible() ) - win_->hide(); - else - display(); + // Save time on current issue if timer is running + if( timer_->isActive() && issue_.id != NULL_ID ) + stop( true, false ); + + if( !timer_->isActive() ) + startTimer(); + + // Display the issue creator with the current issue as parent + IssueCreator* issueCreator = new IssueCreator( redmine_ ); + issueCreator->setTransientParent( win_ ); + issueCreator->setParentIssueId( issue_.id ); + issueCreator->display(); + + // Empty the issue information and set ID to NULL_ID + qml("issueData")->setProperty( "text", "" ); + issue_.id = NULL_ID; + + // Connect the issue selected signal to the setIssue slot + connect( issueCreator, &IssueCreator::cancelled, [=]() + { + if( recentIssues_.rowCount() ) + loadIssue( recentIssues_.at(0).id ); + else + qml("issueData")->setProperty( "text", "" ); + } ); + + // Connect the issue selected signal to the setIssue slot + connect( issueCreator, &IssueCreator::created, [=](int issueId){ loadIssue(issueId, true, true); } ); + + RETURN(); +} + +void +RedTimer::display() +{ + ENTER(); + + win_->showNormal(); + win_->requestActivate(); RETURN(); } @@ -269,84 +325,46 @@ RedTimer::exit() } void -RedTimer::activitySelected( int index ) +RedTimer::issueStatusSelected( int index ) { ENTER(); - activityId_ = activityModel_.at(index).id(); - DEBUG()(index)(activityId_); - - RETURN(); -} - -void -RedTimer::addRecentIssue( qtredmine::Issue issue ) -{ - ENTER()(issue); - - // If found, remove the new issue from the list - for( int i = 0; i < recentIssues_.rowCount(); ++i ) - if( recentIssues_.at(i).id == issue.id ) - recentIssues_.removeRow( i ); - - // Add the issue to the top of the list - recentIssues_.push_front( issue ); - - // Crop the list after ten entries (keep 0..9) - int numRecentIssues = settings_->getNumRecentIssues(); - if( numRecentIssues != -1 ) - recentIssues_.removeRowsFrom( numRecentIssues ); + issue_.status.id = issueStatusModel_.at(index).id(); + DEBUG()(index)(issue_.status.id); - // Reset the quickPick text field - qml("quickPick")->setProperty( "currentIndex", -1 ); - qml("quickPick")->setProperty( "editText", "" ); + updateIssueStatus( issue_.status.id ); RETURN(); } - void -RedTimer::updateIssueStatus( int statusId ) +RedTimer::loadActivities() { ENTER(); - Issue issue; - issue.status.id = statusId; - - redmine_->sendIssue( issue, - [=](bool success, RedmineError redmineError, - QNetworkReply::NetworkError networkError) + redmine_->retrieveTimeEntryActivities( [&]( Enumerations activities ) { ENTER(); - if( !success ) + int currentIndex = 0; + + activityModel_.clear(); + activityModel_.push_back( SimpleItem(NULL_ID, "Choose activity") ); + for( const auto& activity : activities ) { - message( tr("Could not save the time entry. Please check your internet connection."), - QtCriticalMsg ); - RETURN(); + if( activity.id == activityId_ ) + currentIndex = activityModel_.rowCount(); + + activityModel_.push_back( SimpleItem(activity) ); } - message( tr("Issue status updated") ); + DEBUG()(activityModel_)(activityId_)(currentIndex); - issue_.status.id = statusId; - refreshIssueStatuses(); + qml("activity")->setProperty( "currentIndex", -1 ); + qml("activity")->setProperty( "currentIndex", currentIndex ); RETURN(); - }, - issue_.id ); - - RETURN(); -} - -void -RedTimer::issueStatusSelected( int index ) -{ - ENTER(); - - issue_.status.id = issueStatusModel_.at(index).id(); - DEBUG()(index)(issue_.status.id); - - updateIssueStatus( issue_.status.id ); + } ); RETURN(); } @@ -377,10 +395,16 @@ RedTimer::loadIssueFromTextField() } void -RedTimer::loadIssue( int issueId, bool startTimer ) +RedTimer::loadIssue( int issueId, bool startTimer, bool saveNewIssue ) { ENTER()(issueId)(startTimer); + if( issueId == NULL_ID ) + RETURN(); + + if( saveNewIssue ) + issue_.id = issueId; + // If the timer is currently active, save the currently logged time first if( timer_->isActive() ) stop( true, false ); @@ -399,7 +423,7 @@ RedTimer::loadIssue( int issueId, bool startTimer ) .arg(issue.description); qml("issueData")->setProperty( "text", issueData ); - refreshIssueStatuses(); + loadIssueStatuses(); if( startTimer ) start(); @@ -411,6 +435,38 @@ RedTimer::loadIssue( int issueId, bool startTimer ) RETURN(); } +void +RedTimer::loadIssueStatuses() +{ + ENTER(); + + redmine_->retrieveIssueStatuses( [&]( IssueStatuses issueStatuses ) + { + ENTER(); + + int currentIndex = 0; + + issueStatusModel_.clear(); + issueStatusModel_.push_back( SimpleItem(NULL_ID, "Choose issue status") ); + for( const auto& issueStatus : issueStatuses ) + { + if( issueStatus.id == issue_.status.id ) + currentIndex = issueStatusModel_.rowCount(); + + issueStatusModel_.push_back( SimpleItem(issueStatus) ); + } + + DEBUG()(issueStatusModel_)(issue_.status.id)(currentIndex); + + qml("issueStatus")->setProperty( "currentIndex", -1 ); + qml("issueStatus")->setProperty( "currentIndex", currentIndex ); + + RETURN(); + } ); + + RETURN(); +} + void RedTimer::message( QString text, QtMsgType type, int timeout ) { @@ -438,7 +494,6 @@ RedTimer::message( QString text, QtMsgType type, int timeout ) QQuickView* view = new QQuickView( QUrl(QStringLiteral("qrc:/MessageBox.qml")), win_ ); QQuickItem* item = view->rootObject(); item->setParentItem( qml("redTimer") ); - item->setY( 30 ); item->findChild("message")->setProperty( "color", colour ); item->findChild("message")->setProperty( "text", text ); @@ -464,7 +519,31 @@ RedTimer::reconnect() redmine_->setUrl( settings_->getUrl() ); redmine_->setAuthenticator( settings_->getApiKey() ); - refresh(); + refreshGui(); + + if( timer_ && !timer_->isActive() && counter_ ) + stop(); + + RETURN(); +} + +void +RedTimer::refreshGui() +{ + ENTER(); + + loadActivities(); + loadIssueStatuses(); + + QString title = "RedTimer"; + QString url = redmine_->getUrl(); + + if( !url.isEmpty() ) + title.append(" - ").append( url ); + + win_->setTitle( title ); + if( trayIcon_ ) + trayIcon_->setToolTip( title ); RETURN(); } @@ -476,6 +555,24 @@ RedTimer::refreshCounter() qmlCounter_->setProperty( "text", QTime(0, 0, 0).addSecs(counter_).toString("HH:mm:ss") ); } +void +RedTimer::selectIssue() +{ + // Issue selector initialisation + IssueSelector* issueSelector = new IssueSelector( redmine_ ); + issueSelector->setTransientParent( win_ ); + issueSelector->setProjectId( settings_->getProject() ); + issueSelector->display(); + + // Connect the issue selected signal to the setIssue slot + connect( issueSelector, &IssueSelector::selected, [=](int issueId) + { + settings_->setProject( issueSelector->getProjectId() ); + issueSelector->close(); + loadIssue( issueId ); + } ); +} + void RedTimer::start() { @@ -484,7 +581,7 @@ RedTimer::start() // If no issue is selected, show issue selector if( issue_.id == NULL_ID ) { - issueSelector_->display(); + selectIssue(); RETURN(); } @@ -548,20 +645,18 @@ RedTimer::stop( bool resetTimerOnError, bool stopTimerAfterSaving ) // Stop the timer for now - might be started again later stopTimer(); - redmine_->sendTimeEntry( timeEntry, - [=](bool success, RedmineError redmineError, - QNetworkReply::NetworkError networkError) + redmine_->sendTimeEntry( timeEntry, [=](bool success, int id, RedmineError errorCode, QStringList errors) { - ENTER(); + ENTER()(success)(id)(errorCode)(errors); - if( !success && redmineError != ERR_TIME_ENTRY_TOO_SHORT ) + if( !success && errorCode != ERR_TIME_ENTRY_TOO_SHORT ) { message( tr("Could not save the time entry. Please check your internet connection."), QtCriticalMsg ); RETURN(); } - if( redmineError == ERR_TIME_ENTRY_TOO_SHORT ) + if( errorCode == ERR_TIME_ENTRY_TOO_SHORT ) message( tr("Not saving time entries shorter than one minute."), QtWarningMsg ); if( !stopTimerAfterSaving ) @@ -570,8 +665,7 @@ RedTimer::stop( bool resetTimerOnError, bool stopTimerAfterSaving ) if( success ) message( tr("Saved time %1").arg(QTime(0, 0, 0).addSecs(counter_).toString("HH:mm:ss")) ); - if( success || - (resetTimerOnError && redmineError != ERR_TIME_ENTRY_TOO_SHORT) ) + if( success || (resetTimerOnError && errorCode != ERR_TIME_ENTRY_TOO_SHORT) ) { counter_ = 0; qmlCounter_->setProperty( "text", "00:00:00" ); @@ -601,80 +695,48 @@ RedTimer::stopTimer() } void -RedTimer::refresh() +RedTimer::toggle() { ENTER(); - refreshActivities(); - refreshIssueStatuses(); + if( win_->isVisible() ) + win_->hide(); + else + display(); RETURN(); } void -RedTimer::refreshActivities() +RedTimer::updateIssueStatus( int statusId ) { ENTER(); - redmine_->retrieveTimeEntryActivities( [&]( Enumerations activities ) - { - ENTER(); - - int currentIndex = 0; - - activityModel_.clear(); - activityModel_.push_back( SimpleItem("Choose activity") ); - for( const auto& activity : activities ) - { - if( activity.id == activityId_ ) - currentIndex = activityModel_.rowCount(); - - activityModel_.push_back( SimpleItem(activity) ); - } - - DEBUG()(activityModel_)(activityId_)(currentIndex); - - ctx_->setContextProperty( "activityModel", &activityModel_ ); - - if( currentIndex != 0 ) - qml("activity")->setProperty( "currentIndex", currentIndex ); - + if( statusId == NULL_ID ) RETURN(); - } ); - - RETURN(); -} -void -RedTimer::refreshIssueStatuses() -{ - ENTER(); + Issue issue; + issue.status.id = statusId; - redmine_->retrieveIssueStatuses( [&]( IssueStatuses issueStatuses ) + redmine_->sendIssue( issue, [=](bool success, int id, RedmineError errorCode, QStringList errors) { - ENTER(); + ENTER()(success)(id)(errorCode)(errors); - int currentIndex = 0; - - issueStatusModel_.clear(); - issueStatusModel_.push_back( SimpleItem("Choose issue status") ); - for( const auto& issueStatus : issueStatuses ) + if( !success ) { - if( issueStatus.id == issue_.status.id ) - currentIndex = issueStatusModel_.rowCount(); - - issueStatusModel_.push_back( SimpleItem(issueStatus) ); + message( tr("Could not save the time entry. Please check your internet connection."), + QtCriticalMsg ); + RETURN(); } - DEBUG()(issueStatusModel_)(issue_.status.id)(currentIndex); - - ctx_->setContextProperty( "issueStatusModel", &issueStatusModel_ ); + message( tr("Issue status updated") ); - if( currentIndex != 0 ) - qml("issueStatus")->setProperty( "currentIndex", currentIndex ); + issue_.status.id = statusId; + loadIssueStatuses(); RETURN(); - } ); + }, + issue_.id ); RETURN(); } diff --git a/RedTimer.h b/RedTimer.h index 2182955..8023a6e 100644 --- a/RedTimer.h +++ b/RedTimer.h @@ -1,7 +1,6 @@ #ifndef REDTIMER_H #define REDTIMER_H -#include "IssueSelector.h" #include "Models.h" #include "Settings.h" @@ -32,25 +31,22 @@ class RedTimer : public QObject private: /// Redmine connection object - qtredmine::SimpleRedmineClient* redmine_; + qtredmine::SimpleRedmineClient* redmine_ = nullptr; /// Redmine connection dialog object - Settings* settings_; - - /// Redmine issue selector dialog object - IssueSelector* issueSelector_; + Settings* settings_ = nullptr; /// Main application - QApplication* app_; + QApplication* app_ = nullptr; /// Main window object - QQuickView* win_; + QQuickView* win_ = nullptr; /// Main window context - QQmlContext* ctx_; + QQmlContext* ctx_ = nullptr; /// Main item object - QQuickItem* item_; + QQuickItem* item_ = nullptr; /// Show the system tray icon bool showTrayIcon_; @@ -59,13 +55,13 @@ class RedTimer : public QObject QSystemTrayIcon* trayIcon_ = nullptr; /// Timer for stopping the worked on time - QTimer* timer_; + QTimer* timer_ = nullptr; /// Currently tracked time in seconds int counter_ = 0; /// Counter QML element for quick access - QQuickItem* qmlCounter_; + QQuickItem* qmlCounter_ = nullptr; /// Current activity int activityId_ = NULL_ID; @@ -167,9 +163,9 @@ private slots: void exit(); /** - * @brief Display or hide the main window + * @brief Open the issue creator and load issue */ - void toggle(); + void createIssue(); /** * @brief Slot to a selected issue status @@ -204,8 +200,9 @@ private slots: * * @param issueId Issue ID * @param startTimer Automatically start the timer after loading the issue + * @param saveNewIssue When saving tracked time, save time for the newly loaded issue */ - void loadIssue( int issueId, bool startTimer = true ); + void loadIssue( int issueId, bool startTimer = true, bool saveNewIssue = false ); /** * @brief Reconnect to Redmine @@ -215,12 +212,12 @@ private slots: /** * @brief Refresh Redmine entities */ - void refresh(); + void refreshGui(); /** * @brief Refresh activities */ - void refreshActivities(); + void loadActivities(); /** * @brief Refresh the counter @@ -230,7 +227,12 @@ private slots: /** * @brief Refresh issue statuses */ - void refreshIssueStatuses(); + void loadIssueStatuses(); + + /** + * @brief Open the issue selector and load issue + */ + void selectIssue(); /** * @brief Start time tracking @@ -265,6 +267,11 @@ private slots: */ void stop( bool resetTimerOnError = true, bool stopTimerAfterSaving = true ); + /** + * @brief Display or hide the main window + */ + void toggle(); + /** * @brief Handle a tray event * diff --git a/RedTimer.pro b/RedTimer.pro index 46f2460..300407e 100644 --- a/RedTimer.pro +++ b/RedTimer.pro @@ -1,43 +1,50 @@ TEMPLATE = app +QT += gui qml quick svg widgets QMAKE_CXXFLAGS += -std=c++11 -QT += qml quick widgets gui svg +RC_ICONS = icons/clock_red.ico +ICON = icons/clock_red.icns + +VERSION = 0.0.5 +QMAKE_TARGET_COMPANY = "Thomssen IT" +QMAKE_TARGET_PRODUCT = "RedTimer" +QMAKE_TARGET_DESCRIPTION = "Redmine Time Tracker" +QMAKE_TARGET_COPYRIGHT = "LGPL 3" + +HEADERS += \ + RedTimer.h \ + Settings.h \ + logging.h \ + Models.h \ + IssueSelector.h \ + IssueCreator.h \ + Window.h SOURCES += main.cpp \ RedTimer.cpp \ Settings.cpp \ Models.cpp \ - IssueSelector.cpp + IssueSelector.cpp \ + IssueCreator.cpp \ + Window.cpp -RESOURCES += qml.qrc +DISTFILES += \ + .travis.yml \ + README.md \ -# Additional import path used to resolve QML modules in Qt Creator's code model -QML_IMPORT_PATH = +RESOURCES += qml.qrc # No debug statements in release CONFIG(release, debug|release):DEFINES += QT_NO_DEBUG_OUTPUT CONFIG(debug, debug|release):DEFINES += DEBUG_OUTPUT -# Default rules for deployment. -include(deployment.pri) - -HEADERS += \ - RedTimer.h \ - Settings.h \ - logging.h \ - Models.h \ - IssueSelector.h - -CONFIG += c++11 - -win32:CONFIG(release, debug|release): LIBS += -L$$PWD/qtredmine/release/ -lqtredmine +win32:CONFIG(release, debug|release): LIBS += -static -L$$PWD/qtredmine/release/ -lqtredmine else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/qtredmine/debug/ -lqtredmine else:unix: LIBS += -L$$PWD/qtredmine/ -lqtredmine INCLUDEPATH += $$PWD/qtredmine DEPENDPATH += $$PWD/qtredmine -DISTFILES += \ - .travis.yml \ - README.md \ +# Default rules for deployment. +include(deployment.pri) diff --git a/RedTimerForm.ui.qml b/RedTimerForm.ui.qml index 2cb78d1..cf1596b 100644 --- a/RedTimerForm.ui.qml +++ b/RedTimerForm.ui.qml @@ -21,28 +21,48 @@ Item { ToolBar { id: toolBar + height: 32 objectName: "toolBar" anchors.right: parent.right anchors.left: parent.left anchors.top: parent.top ToolButton { - id: settings - objectName: "settings" - text: "&Settings" - anchors.right: parent.right - tooltip: "Open Settings" - iconSource: "qrc:///open-iconic/svg/cog.svg" + id: createIssue + width: 24 + height: 24 + objectName: "createIssue" + text: "Create &new issue" + anchors.verticalCenter: parent.verticalCenter + anchors.leftMargin: 0 + anchors.left: parent.left + tooltip: "Create new issue" + iconSource: "qrc:///open-iconic/svg/plus.svg" } ToolButton { id: reload + width: 24 + height: 24 objectName: "reload" text: "&Reload" + anchors.verticalCenter: parent.verticalCenter anchors.right: settings.left tooltip: "Reload" iconSource: "qrc:///open-iconic/svg/reload.svg" } + + ToolButton { + id: settings + width: 24 + height: 24 + objectName: "settings" + text: "&Settings" + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + tooltip: "Open Settings" + iconSource: "qrc:///open-iconic/svg/cog.svg" + } } @@ -90,7 +110,8 @@ Item { ToolButton { id: selectIssue objectName: "selectIssue" - width: 23 + width: 24 + height: 24 iconSource: "qrc:///open-iconic/svg/list.svg" tooltip: "Select issue from list" } @@ -133,8 +154,8 @@ Item { ToolButton { id: startStop objectName: "startStop" - width: 40 - height: 40 + width: 24 + height: 24 isDefault: true iconSource: "qrc:///open-iconic/svg/media-play.svg" tooltip: "Start time tracking" diff --git a/Settings.cpp b/Settings.cpp index 6c88ee0..b3b2da0 100644 --- a/Settings.cpp +++ b/Settings.cpp @@ -20,7 +20,8 @@ Settings::Settings( SimpleRedmineClient* redmine, QObject* parent ) win_->setResizeMode( QQuickView::SizeRootObjectToView ); win_->setSource( QUrl(QStringLiteral("qrc:/Settings.qml")) ); win_->setModality( Qt::ApplicationModal ); - win_->setFlags( Qt::Tool ); + win_->setFlags( Qt::Dialog ); + win_->setTitle( "Settings" ); // Settings window access members ctx_ = win_->rootContext(); @@ -196,7 +197,7 @@ Settings::updateIssueStatuses() if( apiKey_.isEmpty() || url_.isEmpty() ) { issueStatusModel_.clear(); - issueStatusModel_.push_back( SimpleItem("Currently not available") ); + issueStatusModel_.push_back( SimpleItem(NULL_ID, "Currently not available") ); ctx_->setContextProperty( "issueStatusModel", &issueStatusModel_ ); RETURN(); @@ -213,7 +214,7 @@ Settings::updateIssueStatuses() []( const IssueStatus& a, const IssueStatus& b ){ return a.id < b.id; } ); issueStatusModel_.clear(); - issueStatusModel_.push_back( SimpleItem("Choose issue status") ); + issueStatusModel_.push_back( SimpleItem(NULL_ID, "Choose issue status") ); for( const auto& issueStatus : issueStatuses ) { if( issueStatus.id == workedOnId_ ) diff --git a/Window.cpp b/Window.cpp new file mode 100644 index 0000000..d0c85fb --- /dev/null +++ b/Window.cpp @@ -0,0 +1,79 @@ +#include "Window.h" +#include "logging.h" + +#include +#include + +using namespace redtimer; +using namespace std; + +Window::Window( QString qml, QQuickView* parent ) + : QQuickView( QUrl(qml), parent ) +{ + ENTER(); + + // Issue selector window access members + ctx_ = rootContext(); + item_ = qobject_cast( rootObject() ); + + RETURN(); +} + +bool +Window::event( QEvent* e ) +{ + // Show warning on close and if timer is running + if( emitClosedSignal_ && e->type() == QEvent::Close ) + { + DEBUG()(e->type()); + emitClosedSignal_ = false; + closed(); + } + + return QQuickView::event( e ); +} + + +void +Window::message( QString text, QtMsgType type, int timeout ) +{ + ENTER()(text)(type)(timeout); + + QString colour; + + switch( type ) + { + case QtInfoMsg: + colour = "#006400"; + break; + case QtWarningMsg: + colour = "#FF8C00"; + break; + case QtCriticalMsg: + colour = "#8B0000"; + break; + case QtDebugMsg: + case QtFatalMsg: + DEBUG() << "Error: Unsupported message type"; + RETURN(); + } + + QQuickView* view = new QQuickView( QUrl(QStringLiteral("qrc:/MessageBox.qml")), this ); + QQuickItem* item = view->rootObject(); + item->setParentItem( item_ ); + + item->findChild("message")->setProperty( "color", colour ); + item->findChild("message")->setProperty( "text", text ); + + QTimer* errorTimer = new QTimer( this ); + errorTimer->singleShot( timeout, this, [=](){ if(item) item->deleteLater(); } ); + + RETURN(); +} + +QQuickItem* +Window::qml( QString qmlItem ) +{ + ENTER()(qmlItem); + RETURN( item_->findChild(qmlItem) ); +} diff --git a/Window.h b/Window.h new file mode 100644 index 0000000..880a111 --- /dev/null +++ b/Window.h @@ -0,0 +1,79 @@ +#ifndef WINDOW_H +#define WINDOW_H + +#include +#include +#include +#include +#include +#include + +namespace redtimer { + +class Window : public QQuickView +{ + Q_OBJECT + +private: + /// Emit the closed signal upon closing + bool emitClosedSignal_ = true; + +protected: + /// Main item + QQuickItem* item_; + + /// Window context + QQmlContext* ctx_; + +public: + /** + * @brief Window constructor for a window from a QML file within a Qt resource file + * + * @param qml Path to the QML file within the Qt resouce file + * @param parent Parent QObject + */ + Window( QString qml, QQuickView* parent = nullptr ); + + /** + * @brief Get a QML GUI item + * + * @param qmlItem Name of the QML GUI item + * + * @return QML GUI item + */ + QQuickItem* qml( QString qmlItem ); + +protected: + /** + * @brief Filter Qt events + * + * Emits the canceled signal when window has been closed. + * + * @param event Received event + * + * @return true if event has been processed, false otherwise + */ + bool event( QEvent* event ); + +public slots: + /** + * @brief Display a message + * + * @param text Message to display + * @param type Message type (one of \c QtInfoMsg, \c QtWarningMsg and \c QtCriticalMsg) + * @param timeout Duration in milliseconds that the message will be displayed + */ + void message( QString text, QtMsgType type = QtInfoMsg, int timeout = 5000 ); + +signals: + /** + * @brief Signal that will be emitted when closing the window + * + * This signal will be emitted only once. + */ + void closed(); +}; + +} // redtimer + +#endif // WINDOW_H diff --git a/icons/clock_red.icns b/icons/clock_red.icns new file mode 100644 index 0000000..313f223 --- /dev/null +++ b/icons/clock_red.icns @@ -0,0 +1,910 @@ +(This file must be converted with BinHex 4.0) +:%')i0@9N-cKQ-f0Q06CNC6-%9%9B9(4dH(3%!!!!!Y!!!+F$!m*)EhFJG'mJGA0 +P)(4SDA-JD@0[EMS+#P0dCA!J-6SJ3fp`H5"dD'8JD@0[EL"dEb"dD'8JBfaTF'* +[BA*N#Q%T)%0XD@0V)'pZ)(4SDA-JCQPXC5"QFQpY)(4SC5"'D@jNCA)+BLNJ3fK +[Eh0P)#G(CA3J5@jQEbFJCR*[E5"dD'8J*dCTE'8R)'ePER8Z#Q-T)%PZ)(4SC5" +TEQC[)(GTEQ4[Gb"dD'&d)("[F(-JGA!X)'0XD@0V)'pZ)(4SC5"TBfpZ#Q3T)%0 +SEfpcC5!R3fp`H5FJCR*[E5"dD'8J*d9NDA3R)'ePER8Z#Q8T)%0XEh0P)(4SC5" +TEQC[)(GTEQ4[G`S+8h4PF#!b1L"3BA0dC5"dD'8JD@0[EL"dEb"dD'8JC'9cDA* +PC#"TG'9Y#Q%T)%G[)(4[)(4SC5"TG'9Y)'PZ)(4SC5"'D@jNCA)JG'KKG#"jEh8 +JGf&ZG#"K)'0eFh4[E5"TBfpZ#Q)T)%0XD@0V)(4SC5"TG'9Y)#KQD@aP,#"QEfa +NCA)X)'4TFfXX)'9dBbNJ#Q)T)%0SEfpcC5!R4f9d)%PZCQmR)'CbEfdJG'KP)#G +'D@aP*b"YC@je,JTM+5"*EL"dD'8JD@jQEb"hD@jNEhFJG'KKG#"`Eh"c)(9`,#" +ME'PMDb"[EL"dD'8JD@0[EJTN+5"$D'p[Ff8J*e"KFh4P*b"QFQpY)(4SC5!R4@4 +TG#FJE@9ZG5i+C5NJ3fa[Ff8JG'KP)'PZCQmJGfPZC'ph#JT6G'9`)$-k)!T&EQT +[H5"jEh9b)'jPGfaj)'0eFh4[E@PkC@3JD@0[EL%+#NC[FL"YEh*P)(4SEh*[G@G +S)'4TFQ9MG'P[ER-X)(0PC5""F("XC5Gc)(GPBR0TG'8JBA3k#QKdG(!k,bphGhF +ZBA"`E'8ZBfpY,h0eF("[FR3[E@&M-6!a,f0eFh4[E@PkC5mf,`V6V!!!!3!!!+E +4!!#Pd3!!!$)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!+A0D@0ZF`!!TFeTFc-b!!!!&2rrqrrr!2X!r`$l!(-iE@X!!!% +)!!%$!$@Iirlqijme!!-"!!%!"j(mrrrcmrrrr*%(!!%!"lVrmSSa%4%aL[,rZJF +!!*(rh#d!!JB'!J!Yh2q4!$RmpM%!!K(Fh"%#!$(fr$QFriN!"`!3m[)4!!F!LIq +Fhrmf!!3!%1ra%J!$!$Erhrlb&J!#!"([q"i!!`!@m[lqmKB!!J!#`[r,&`!!&[, +qhrmf!!)"!"$5k4X!!$IrhjcrL3!'!!)!)#-!"`#*rj`jr2Ba!!B$!`)#"`!bpr` +j!*(rh#d!!J!!!J!Yh2q4!!!(Z[rbLM)8&$'+m[qk"`!"!!H4r2rrm[,rrrb4"`! +"!!%$!$@Iirlqijme!!-"!'PX-c)!!!#[J3#9ri-!QIq!!*[r!!$,ri%!rrq6r`! +!Krm!!*!!r`%!!)Ir!3!!Mrm"!!#(r`%!!)lrJ!#)r`%!!)hrJ!#*r`!!M2q"!)V +r!!#,ri%!LIm"!!#-ri!!Q[q"!*Vr!3!!Qrq!!*[rJ!#Eri!!R2q$!*MrJ3#jri% +!brm!!*[rJ!#Cri-!PIq"!2m!r`$r!2m!r`$r!2m!l`$r!2m!r`$r!2m!r`$r!1m +!E$KYD`!!"!J!!!!!!!!"!`%!&@#Qer(prI(ATf!@!!%$!3!!!!!!!!!!!!!!!J- +!*CMXrrlrrrlqrrrqrqfC*J!$!J!!!!!!!!!!!!-!"iIkrrrlq2[rrrrrqrMlrrr +kL!F!!`!!!!!!!!!$!#(0rrcjqrrrrrV[m2[rrrrlqIcrcL)!!`!!!!!!!`![jrr +kqrlrf)4&)K36)N5$f2rqqrVrk#m!!`!!!!)!*1Erqrcrh&3%!!!!!!!!!!!%90c +rr2[rjL3!!J!"!!M+rr[mrk!+!!)%!`!!!!!$"!)!#D$rr2[rbJF!!3-!Krrkr2q +(!!)%!3!!"JB'"J!!!33#!)Err2VrK`!$!#Rirr[rRJ!%!J!"!!r3iZ,3$`!"!!% +%!*lrqrri+3!!PrrkrpJ0!!)!!!%!%Hlrrqi4!!%!!!)!$GMrq[qA!"RSrrcr@!! +%!!!!!3!4l2rrl"%!!3!!!!3!@2rmrqJBB2rlrp3&!!!!!!!"!"(ZrrrZ%3!"!!! +!!!!&eIrlrf#PrrMrK3!%!!!!!!%!%Hlrrqi4!!%!!!!!"!#'rrMrTGErqrp(!!- +!!!!!!3!4l[rrlK-!!3!!!!!$!%Irqrr9m2rrqb-!!J!!!!!"!"(YrrrZ%J!"!!! +!!!)!*2[rrr$pr[r[&!!"!!!!!!%!%Hcrr[p'!!8!!!!!!3!8m2rqrIhqrqm8!!% +!!!!!!3!2k[rmrr0"!!)!!!!"!"6`rrlpm2rrqb-!!J!!!!!!!J"6q[lmrrTG!!) +!!!)!*2[rrr$9rr[r4`!$!!!!!!!!!J"1q[lkrh8!!`!!!`"(rr[reDArq2q&!!3 +!!!!!!!!!"3"3rIpZ!!)!!!!%!)Erq2qPB2rlrp8&!!!!!!!!!!!!"3"YH!!%!!! +!!!!&eIrlremBk2rmreJ!"!!!!!!!!!!!!J!!!J!!!!!%!&Mrr2rS'!#ArrVrf!d +!!J!!!!!!!!!!!J)!!!!!!J!0f2rkrjB!!#Rirr[rRJ!%!J!!!!!!!!!!!!!!!!) +%!*lrqrri+3!$!)Irq[crK`!#"!%!!!!!!!!!!!%%!J#(rrckriF!!`%!"mVrqrc +rS!S!!J3$!J%"!J-%!J!+S2rmqrr*"`!"!!)!)qErqrcrh&8%!!!!!!!!!!!%9Gc +rr2[rjL-!!J!!!!-!,qIrq[[qrpL%45)8&#*%JpMrr[[krqF[!!-!!!!!!!-!)Fh +rrIRlrrrrqr$`qrrrrr[jr2r1)3!$!!!!!!!!!!-!"iIkrrrlq2[rrrrrqrMlrrr +kK`F!!`!!!!!!!!!!!!)$!#@Bl2rqrrrqr[rrr[rYQ#8!!`)!!!!!!!!!!!!!!!% +$!3!9AkE@mIhpmGDRB"B!!3-"!!!!!!!!D@Jc-J!!!AL'!*[rMJ#GriX!SIq)!+2 +rKJ#Pri3!Trq#!+RrJ3#3!2q$!*!!ri!!Urm!!-$rK`#Kr`!!LIm!!*lr!3!!LIm +"!!#Fri!!LIq!!*VrJ3#*ri%!Q2q#!)RrJJ#@ri-!LIq$!*6rK!#*ri3!Nrq%!)R +rK!#5ri8!LIq&!*(rK3#*ri8!NIq&!)VrK!#3!2q'!)[rK!#2riB!M2q$!)rrKJ# +0ri)!Mrq'!)crJ`#3!2q'!)crJ3#4ri8!MIq"!*(rKJ#,ri)!N[q'!)[rJ!#6riF +!LIq"!*6rK`#(ri%!P[q(!)ArJ3#BriF!Jrq"!*VrM`#Frid!R[q,!+(rK`#Pri- +!N[m!!+[rJ!#3!2q$!*!!ri%!UIq#!+IrK!#PriB!Srq)!+(rL`#Grii!Qrq'!2m +!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$E!2m!r`$r!2m!r`$r!2m +!r`$r!2m!r`$r!2m!r`$r!2m!r`$E!'JiE@X!!!N)!!!!!!!!!!!!!!!!!J3!!!! +NBC[)j2AprIANb*YL*!!!!!-#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%$!3!9Dm, +frrrrrrrrrrrrrrrrpX0Y&J!"!`%!!!!!!!!!!!!!!!!!!!!!!!!!!J-!'Srarrl +rrIcpr[rrrrrqrIcprrlrmC!!'J!$!J!!!!!!!!!!!!!!!!!!!!!!!`!$Fr(rr[c +mr[rrrrrqr[lqrrrrrrlmr2lrmA3$!!-!!!!!!!!!!!!!!!!!!!!%!#A)rrhlr[r +rrrhlr2lrrrrrr[clrIrrrrllrIr)*J!%!!!!!!!!!!!!!!!!!!3!6I(rqrlrrrl +lr[rrrrrhlqrhrrrrrrllr[rrr[[rm8i!"!!!!!!!!!!!!!!!"!"Prrlmrrrrr2l +rrY55@$%G%a-G-PH2e2rrr[crrrrmr[pP!!3!!!!!!!!!!!!%!'Arr2hrrrlmrrL +L1!)!!!!!!!!!!!!!!MHKq2rmr[rrrIcrCJ!%!!!!!!!!!!-!6rrpr[rrrIhrXbF +!!3%%"!)#!3%#!J3%!3%!*l2rrIhrrrlprdm!!`!!!!!!!J!Tlrrprrrprr9L!!% +$!`!!!!%"!3%"!3!!!!-$!3"KpIrprrrprqmT!!)!!!!!!!2$rrcrrrcrjM-!"!) +!!!!!!!!!!!!!!!!!!!!!!J3!-qArr2rrr2r$!`!!!!!$!(ArqrrrrIrN*`!&!!! +!!!!!!!)#!J)#!J!!!!!!!!!&!#IPrrhrrr[rG3!$!!)!(Zhrr[rqrr8f!!3!!!! +!!!%!$XREeYEEb3i!!3!!!!!!"!!fpIrqrrlrl4i!!J3!Mrrlrrrmrf-!"3!!!!! +!!!%!%Hlrr[lrlK%!!3!!!!!!!!8!Brrmrrrlrii!"!!ClIrqrrcrV`!$!!!!!!! +!!!%!%Hcrr2crl"%!!3!!!!!!!!!$!+rrr2rqrqdC!!"Yrr[rr[rj,3!#!!!!!!! +!!!%!%Hlrr[lrlK%!!3!!!!!!!!!#!#hjrrlrqrpX!!$!rrcrr2qI!!-!!!!!!!! +!!!%!%Hlrr[lrlK%!!3!!!!!!!!!!!`#Irrcrr2qr!#Edrrlrr[mm!!)!!!!!!!! +!!!%!%Hlrr[lrlK%!!3!!!!!!!!!!!`!mrrlrr[rc*@(rrIrprp-#!!%!!!!!!!! +!!!%!%Hlrr[lrlK%!!3!!!!!!!!!!!3!#drrprrhrB*Rrr2rlrj%!"!!!!!!!!!! +!!!%!%Hlrr[lrlK%!!3!!!!!!!!!!!!3!N[rlrrcrQFErrIrmreN!"!!!!!!!!!! +!!!%!%Hlrr[lrlK%!!3!!!!!!!!!!!!3!@IrmrrhraZ2rr[rqrc)!!J!!!!!!!!! +!!!%!%Hlrr[lrlK-!!3!!!!!!!!!!!!)!-rrqrrlrirArrrlrpKd!!J!!!!!!!!! +!!!%!%Hlrr[lrla)!!J!!!!!!!!!!!!)!([Err[rrp2hrrrlrla-!!3!!!!!!!!! +!!!%!%1crr[rpri3!"!%!!!!!!!!!!!%!%qrrr[rrrIhrrrlrla-!!3!!!!!!!!! +!!!%!%Hlrr[rrrIq%!!3"!!!!!!!!!!%!%qrrr[rrrIArrrlrpKd!!J!!!!!!!!! +!!!!!!+crqrrrrr[rM`!!!!!!!!!!!!)!([Err[rrp12rr[rqrc)!!J!!!!!!!!! +!!!!"!!#GrrVrrrrlrkm*!!%!!!!!!!)!-rrqrrlrimErrIrmreN!"!!!!!!!!!! +!!!!!!3)!RIrlrrrlrp33!!%!!!!!!!3!@IrmrrhraTRrr2rlrj)!"!!!!!!!!!! +!!!!!!!%#!*hrqr[rbK)!!3!!!!!!!!3!N[rlrrcrQ@$rrIrprp-#!!%!!!!!!!! +!!!!!!!!"!J#Rrrr,%J!#!!!!!!!!!3!#drrprrhrB#Edrrlrr[mm!!-!!!!!!!! +!!!!!!!!!!J%%a083!!-!!!!!!!!!!`!prrlrr[rc*3#rrrcrr2qI!!-!!!!!!!! +!!!!!!!!!!!%!&aN!!J!!!!!!!!!!!`#Jrrcrr2qr!!"Xrr[rr[rj,3!#!!!!!!! +!!!!!!!!!!!!"!3%"!!!!!!!!!!!#!#hjrrlrqrpX!!!ClIrqrrcrX!!$!!!!!!! +!!!!!!!!!!!!!!3%!!!!!!!!!!!!$!,$rr2rqrq`B!!3!M[rlrrrmrf-!"3!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!8!Brrmrrrlrii!"!)!(Zhrr[rqrr8f!!3!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!"!!fpIrqrrlrl"i!!J!$!(ArqrrrrIrP+!!%!!! +!!!!!!!!!!!!!!!!!!!!!!!!&!#MPrrhrrr[rG!!$!!!!!!2$rrcrrrcrjM3!"!) +!!!!!!!!!!!!!!!!!!!!!!J3!01Err2rrr2r$!`!!!!!!!J!SlrrprrrprrCL!!% +$!`!!!!!!!!!!!!!!!!-$!3"KpIrprrrprqiS!!)!!!!!!!-!6rrpr[rrrIhrY#F +!!3%%"!)#!3%#!J3%!3%!*l2rrIhrrrlprdm!!`!!!!!!!!!%!'Arr2hrrrlmrrL +L1!-!!!!!!!!!!!!!!cHKqIrmr[rrrIcrC3!%!!!!!!!!!!!!"!"Prrlmrrrrr2l +rrY@5@$)G%a-G-PL2eIrrr[crrrrmr[pP!!3!!!!!!!!!!!!!!!3!6I(rqrlrrrl +lr[rrrrrhlqrhrrrrrrllr[rrr[[rm8d!"!!!!!!!!!!!!!!!!!!%!#6(rrhlr[r +rrrhlr2lrrrrrr[clrIrrrrllrIr)*3!%!!!!!!!!!!!!!!!!!!!!!`!$F[$rr[c +mr[rrrrrqr[lqrrrrrrlmr2lrmA-$!!-!!!!!!!!!!!!!!!!!!!!!!!)$!"Q1m2r +qrrhmrIlrrrrrr[hmrIrqrr'2'J!$!J!!!!!!!!!!!!!!!!!!!!!!!!!"!`%!&@[ +"p[rrrrrrrrrrrrrrrrE#E4B!!3-"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)%!!! +!)f'Eaq6drIhdj-HEBL-!!!!%!J!!!!!!!!!!!!!!!'Pd-c)!!!@L!!!!!+B!Urr +0!,$ra`#erm-!ZIqr!,hrZ`$"rlF!aIqd!-IrX3$,rki!cIqV!0(rU!$6rkB!eIq +N!0IrSJ$Crk!!frqH!0hrR!#SriN!U2qD!1(rQ!#UriN!U[q@!+IrN3#Rrj3!TIq +A!+ArNJ#Mrjd!Srq4!+(rS3#Krj!!!+$rT3#Jrii!RrqT!*rrM3#HrkX!R[q-!*h +rV`#GriS!RIqa!*hrL3#Erl8!Qrq)!*[rM`#6rim!Qrq(!*VrZ3#DriB!Q[q4!*2 +rN3#Dri8!QIq5!*2rNJ#Cri3!QIq6!*2rN`#Cri-!Q2q8!*2rP!#Bri)!Q2q9!*2 +rP3#Bri%!Q2q9!*2rP3#Bri!!Q2q@!*2rPJ#Bri!!P[qA!*2rP`#@ri!!PrqA!*2 +rP`#Ar`!!PrqB!*2rQ!#`rjN!NrqC!+rrQ3#6rjN!V[qD!*2rQJ#YrjS!NrqD!+c +rQ`#6rjX!UrqE!*2rQ`#Urj`!NrqF!+RrR!#6rj`!UIqF!*2rR!#Srjd!NrqG!+E +rRJ#6rji!T[qG!*2rR3#Qrji!NrqH!+ArRJ#6rji!TIqH!*2rRJ#Nrjm!NrqI!+6 +rRJ#6rji!T2qI!*6rRJ#Mrjm!PIqG!+2rR`#@rj`!SrqI!*IrQ`#Mrjm!Q2qD!+2 +rR`#CrjN!SrqI!*VrQ!#Mrjm!QrqA!+2rR`#FrjB!SrqJ!*crP3#Nrji!R[q6!+6 +rS!#Frj8!T2qJ!*crN`#Prk%!Qrq6!+ArSJ#Drj-!T[qL!*RrNJ#Qrk3!Q2q6!+E +rT!#@rj-!U2qN!*6rN`#Trk8!N[q8!+RrTJ#3!2q9!+VrTJ#1rj8!UrqR!)crPJ# +XrkF!L[q@!+hrU!#)rjF!V[qS!)ErP`#[rkJ!KIqB!,$rb3#Ar`!!Prr(!*IrJ!# +@rmF!P[q!!*Mra3#Bri!!Q2r$!*MrJ3#Brm-!Q2q#!*Mr`3#Bri-!QIqr!*RrK!# +Crld!QIq&!*VrZ`#DriB!Q[qj!*VrK`#ErlF!Qrq)!*[rY3#EriN!RIqa!*hrLJ# +Grkm!RIq-!*lrU`#Hrid!RrqT!*rrMJ#Jrk8!S2q3!!#Krk%!SIq4!+2rR3#Mrj) +!TIqA!+ArP!#Rrj%!Trq@!+VrL3#UrjJ!iIqD!+MrL3#Srj`!hIqH!0[rS!$Crk) +!erqN!0ArTJ$6rkJ!dIqV!-hrVJ$,rl%!arqd!-ArY`$"rlX![Iqr!,Rr``#ermJ +!X2r-!+[rTJ$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m +!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m +!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m +!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m +!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m +!r`$r!2m!r`$r!2m!r`$r!2m!r`#"!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m +!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m +!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m +!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m +!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m +!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!2m!r`$r!)%!G$KYD`!!3!J!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%$"!!!!!! +!#5Y8Fj+Z`YASm2EprIE`k0A#Vj*b9#X*!!!!!!!%!`%!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-$!!!!!Kp4KlMJprrrrrrrrrrrrrrrrrr +rrrrrrrrrpq#iL9FK!J!!!!-$!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!J-!!!!,4SR,q2rrrrrrrrclrIhqr[lrrrrrr[lqrIhlr2rrrrrrrrV,L%8 +,!!!!!`)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`)!!!G'Nq(rr[rrr[[ +mr[lrrrrrrrrrrrrrrrrrrrrrrrrrrrlqr2[prrrrrq5@4JF!!!)$!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!`%!!"pieIrqrrllr2lrrrrrrrrrrrrrrrrrrrrrrrr +rrrrrrrrrrrrrrrrqr2[qrrlrfRmN!!!#!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`) +!!$HPp[rrr[[prrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr +pqrlrrrHQ2!!!!J-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J)!!%+mr[rrr2hrrrrrrrrrrrr +rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrhmrrrpZd3!!!)#!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!3-"!$Zir[rqr2lrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr +rrrrrrrrrrrrrrrrrrrrrrrrrrrrqr2lrrlNk!!%$!3!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-#!"kIr2r +pr2rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr +rrrrrrrrrrrcprrfP)3!#!J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%$!!9dmIrpr2rrrrrrrrrrrrrrrrrrrrr +rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmrIraG`F +!!`%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!#!`!earrpr2lrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr +rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr2hrbM3!!`)!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`!#H2Rrr2hrrrr +rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr +rrrrrrrrrrrrrrrrrrI[rqA`$!!-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!33!),hrr2crrrrrrrrrrrrrrrrrrrrrrrrrrrr +rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrc +mrl`I!!3"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!%$!%ISrr[qrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[lqr[lqr[l +qr[rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrllrqP*!!-"!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!J"dr2rmrrrrrrrrrrr +rrrrrrrrrrrrrrrrrrrrrrrrqr[clqrlrrrrrrrrrrrrrr[[lr2lqrrrrrrrrrrr +rrrrrrrrrrrrrrrrrrrrrrrrmrree!!)#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!J%$PrrmrIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrh +lr2rrrrrrrrrlp[6bm[6fqrrrrrrrrrrmqrhrrrrrrrrrrrrrrrrrrrrrrrrrrrr +rrrrpr2qC"!%#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!) +!$V2rqrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrI[qrrrrrH5kNR0@25`G&K!3&4d +Y2PCcNl[Mr2rrrrllrIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqr2qa$J!#!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!"'rrr[rrrrrrrrrrrrrrrr +rrrrrrrrrrrrrqrhrrrlLSfNe#3!!!!!!!!!!!!!!!!!!!!!!!!NYC*hGrrrrr[c +qrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrr"%`!#!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!`!AbIrlrrrrrrrrrrrrrrrrrrrrrrrrrrrqr2rrrpZ-2`N +!!!!!!!3&!`)#!J%"!3%#!J)$"33!!!!!!!FrMG[rrrrmr[rrrrrrrrrrrrrrrrr +rrrrrrrrrqrr*&`!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)!%mM +rqrrrrrrrrrrrrrrrrrrrrrrrrrrqr2lrq+a2#!!!!!)%!J%"!!!!!!!!!!!!!!! +!!!!!!!!"!J3$!!!!"dLXq2rqr2lrrrrrrrrrrrrrrrrrrrrrrrrrqrr*%`!#!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!l!rr[rrrrrrrrrrrrrrrrrrrr +rrrrrr2hrm*-V!!%!!`-"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!`-!!3! +QNI,rr[crrrrrrrrrrrrrrrrrrrrrrrrrqrr"$J!"!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!3!$X[rlrrrrrrrrrrrrrrrrrrrrrrrrrIcrpC)H!!%#!`%!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%$!J%!(j2frrcprrrrrrrrrrr +rrrrrrrrrrrrrqrqa!`!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!*Arqrr +rrrrrrrrrrrrrrrrrrrrrr[cqrl%X!!%$!J!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!J-"!#L`rrlmr[rrrrrrrrrrrrrrrrrrrrrrqrq@!!- +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`"errcrrrrrrrrrrrrrrrrrrrrrrrl +mrq&5!!%$!J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!)$!!"3h[rmr[rrrrrrrrrrrrrrrrrrrrrrr2pf!!-!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!-!5Ilqr[rrrrrrrrrrrrrrrrrrrrrprIqM%3!$!J!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!`!4RrrqrIrrrrr +rrrrrrrrrrrrrrrrqr[j*!!-!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!#6Nrrhrrrr +rrrrrrrrrrrrrrrrrr2r`A3!"!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`%!A2(rr2rrrrrrrrrrrrrrrrrrrrrprq8 +M!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!%!Zrrlrrrrrrrrrrrrrrrrrrrrrr[re#i +!"!)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!J3!,G6rqrrrrrrrrrrrrrrrrrrrrrrlrlS!!3!!!!!!!!!!!!!!!!! +!!!!!!!!$!([rr2rrrrrrrrrrrrrrrrrrrrrmrlF5!!3!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3-!%EArr2r +rrrrrrrrrrrrrrrrrrrrmrhN!!`!!!!!!!!!!!!!!!!!!!!!!!`!jqIlqrrrrrrr +rrrrrrrrrrrrrr2qJ"3!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!"Crrr2rrrrrrrrrrrrrrrrrrrrl +rq6J!!`!!!!!!!!!!!!!!!!!!!!%!!m2rr2rrrrrrrrrrrrrrrrrrrrcrP!!#!J! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!)#!*6rr2rrrrrrrrrrrrrrrrrrrrcra!-!!3!!!!!!!!!!!!! +!!!!!!`"frrcrrrrrrrrrrrrrrrrrrrrlrj3!!`%!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!)#!J)#!J)#!J)#!J)#!J)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%$!*A +rqrrrrrrrrrrrrrrrrrrrrrcrG!!$!!!!!!!!!!!!!!!!!!)!*Hlrr[rrrrrrrrr +rrrrrrrrrr2qI!!)"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%#!*lrr2rrrrrrrrrrrrrrrrr +rr[rY*!!#!!!!!!!!!!!!!!!!!J#MrrcrrrrrrrrrrrrrrrrrrrcrY33"!J!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!"!!QFU+5PTD@PTD@PTD@PT+LF#3!"!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!)!"EIrr2rrrrrrrrrrrrrrrrrrr2qK!!)!!!!!!!!!!!! +!!!)!32rrrrrrrrrrrrrrrrrrrrrprp%6!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!%!$[(rr[rrrrrrrrrrrrrqrr%1!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!) +!&0,rrIrrrrrrrrrrrrrrrrrrrrmr!!)!!!!!!!!!!!!!!3#errcrrrrrrrrrrrr +rrrrrr[r`-3!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!0l[rkqr[lqr[lqr[ +lqrVrlJd!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!-1rrr[rrrrrrrrrrrrr +rrrrmrl8!!3!!!!!!!!!!!!-!4rrqrrrrrrrrrrrrrrrrrrrprei!"!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!"!!larrlrrrrrrrrrrrrrr[ra$J!"!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!3!A[rprrrrrrrrrrrrrrrrrrrrrd8!!`!!!!!!!!! +!!3#irrcrrrrrrrrrrrrrrrrrr2qI!!-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!%!$[(rr[rrrrrrrrrrrrrqrr%1!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!-!RrrmrrrrrrrrrrrrrrrrrrcrY`!"!!!!!!!!!!)!2[rrrrrrrrrrrrrrrrr +rrrhrfa8!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!1mIrqrrrrrrrrrrr +rrrlrm3i!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!@h2rprrrrrrrrrrr +rrrrrrrrq23!#!!!!!!!!!J#QrrcrrrrrrrrrrrrrrrrrrIp8!!-!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!"!!larrlrrrrrrrrrrrrrr[ra$J!"!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!`"5rrlrrrrrrrrrrrrrrrrrr2qP!!)!!!!!!!) +!*[Irr[rrrrrrrrrrrrrrrrcrV`!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!%!$[(rr[rrrrrrrrrrrrrqrr%1!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!J#`rrcrrrrrrrrrrrrrrrrqrrBN!!)!!!!!"!"prr[rrrrrrrrrrrrrrrr +qrrF`!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!1mIrqrrrrrrrrrrr +rrrlrm3i!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!$(irrlrrrrrrrr +rrrrrrrrlrhX!"!!!!!%!"YArrIrrrrrrrrrrrrrrrr[rN`!$!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!"!!larrlrrrrrrrrrrrrrr[ra$J!"!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!*6rqrrrrrrrrrrrrrrrrrhre!B!!3!!!`" +*rrlrrrrrrrrrrrrrrrrqrr!N!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!%!$[(rr[rrrrrrrrrrrrrqrr%1!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!)!*I,rr[rrrrrrrrrrrrrrrrlr4`!$!!!$!*Erqrrrrrrrrrrrrrrrrr[ +rNJ!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!1mIrqrrrrrrrrrrr +rrrlrm3i!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!P2rlrrrrrrr +rrrrrrrrrqrq9!!-!!3!-iIrqrrrrrrrrrrrrrrrqrrNX!!)!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!"!!larrlrrrrrrrrrrrrrr[ra$J!"!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J!Zq[rqrrrrrrrrrrrrrrrprq!,!!%$!%I +rrrrrrrrrrrrrrrrrrrcrUJ!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!%!$[(rr[rrrrrrrrrrrrrqrr%1!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!J#Vrrcrrrrrrrrrrrrrrrrrrd8!!`3!L2rlrrrrrrrrrrrrrrrrr[p +2!!-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!1mIrqrrrrrrrrrrr +rrrlrm3i!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!&(rr[rrrrr +rrrrrrrrrrr[rKJ!%!!,,rrhrrrrrrrrrrrrrrrhrf3F!!3!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!"!!larrlrrrrrrrrrrrrrr[ra$J!"!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!#G[rrIrrrrrrrrrrrrrrrIr*!3!!)2I +rr[rrrrrrrrrrrrrrqrq0!!-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!%!$[(rr[rrrrrrrrrrrrrqrr%1!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!-!M[rlrrrrrrrrrrrrrrrqrrFI!!"@rrhrrrrrrrrrrrrrrrlrrd! +!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!1mIrqrrrrrrrrrrr +rrrlrm3i!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`"#rrrqrrr +rrrrrrrrrrrrpre3!!)Rrqrrrrrrrrrrrrrrrr[rI#3!"!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!"!!larrlrrrrrrrrrrrrrr[ra$J!"!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!VJrrlrrrrrrrrrrrrrrr[rL!!!Z2r +mrrrrrrrrrrrrrrrlrji!!J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!%!$[(rr[rrrrrrrrrrrrrqrr%1!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!#!+$rqrrrrrrrrrrrrrrrr2qh!!VKrrlrrrrrrrrrrrrrrrcrCJ! +%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!1mIrqrrrrrrrrrrr +rrrlrm3i!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!D2rmrrr +rrrrrrrrrrrrqrq!++rErr[rrrrrrrrrrrrrqrrX[!!)!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!"!!larrlrrrrrrrrrrrrrr[ra$J!"!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J!ar2rqrrrrrrrrrrrrrrlrp5P8rrr +rrrrrrrrrrrrrrrlri`N!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!%!$[(rr[rrrrrrrrrrrrrqrr%1!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!"!!VNrrlrrrrrrrrrrrrrrrrr8R6rrIrrrrrrrrrrrrrrr2qj!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!1mIrqrrrrrrrrrrr +rrrlrm3i!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,[rr2r +rrrrrrrrrrrrrrIpbN[rlrrrrrrrrrrrrrrrlrj%!!`!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!"!!larrlrrrrrrrrrrrrrr[ra$J!"!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!Nrrlrrrrrrrrrrrrrrrlrj'[rrc +rrrrrrrrrrrrrrr[rF`!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!%!$[(rr[rrrrrrrrrrrrrqrr%1!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!"!"err[rrrrrrrrrrrrrrrcrVX2rrIrrrrrrrrrrrrrrrIp@!!- +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!1mIrqrrrrrrrrrrr +rrrlrm3i!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!&IrrIr +rrrrrrrrrrrrrrIr#eIrqrrrrrrrrrrrrrrlrrcd!!`!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!"!!larrlrrrrrrrrrrrrrr[rb$`!"!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!2rrrr[rrrrrrrrrrrrrqrp6Rrrl +rrrrrrrrrrrrrr[rl,!!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!%!$[(rr[rrrrrrrrrrrrrqrr%1!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!J!Zqrrqrrrrrrrrrrrrrrlrj[$rrrrrrrrrrrrrrrrqrrBG!!% +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!1mIrqrrrrrrrrrrr +rrrrrrdd!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!"lfrrl +rrrrrrrrrrrrrrrr[p[rrrrrrrrrrrrrrrrlrp"B!!3!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!"!!larrlrrrrrrrrrrrrrrrlrp%N!"!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!&r6rr[rrrrrrrrrrrrrrrrAprrr +rrrrrrrrrrrrrr[rb%!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!%!$[(rr[rrrrrrrrrrrrrrrrlrp8N!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!3!3m[rqrrrrrrrrrrrrrrrrr2hrrrrrrrrrrrrrrrrqrr)3!!% +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!1mIrqrrrrrrrrrrr +rrrrrrrhrp8N!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!"$brrl +rrrrrrrrrrrrrrrrmp[rrrrrrrrrrrrrrrrlrp"B!!3!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!"!!h`rrlrrrrrrrrrrrrrrrrrrrhrp8N!"!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!&r6rr[rrrrrrrrrrrrrrrrA`rrr +rrrrrrrrrrrrrr[rf(3!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!%!$[(rr[rrrrrrrrrrrrrrrrrrrrhrp%S!"!%!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!3!Hp[rqrrrrrrrrrrrrrrrrlqIrr[rrrrrrrrrrrrrqrrXY!!) +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!%c2rlrrrrrrrrrrr +rrrrrrrrrrrhrq&X!!`%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!#llrrl +rrrrrrrrrrrrrr[rQeIrqrrrrrrrrrrrrrrlrrci!!`!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!3!5Xrrmrrrrrrrrrrrrrrrrrrrrrrlprh)!!`% +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!2rrrr[rrrrrrrrrrrrrqrp6$rrh +rrrrrrrrrrrrrrrhr9J!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!3!"M[rmr[rrrrrrrrrrrrrrrrrrrrlmriX!!J)!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!`"Arrhrrrrrrrrrrrrrrrhr`Urrr2rrrrrrrrrrrrrrqrpd!!3 +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J-!Krrmr[rrrrr +rrrrrrrrrrrrrrrlmrk%'!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!(Arqrr +rrrrrrrrrrrrrr2qYN[rlrrrrrrrrrrrrrrrlrj)!!`!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3-!Krrmr[rrrrrrrrrrrrrrrrrrrrllrlN +A!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!Nrrlrrrrrrrrrrrrrrrlrj!!G2r +prrrrrrrrrrrrrrrmrlS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!%$!)Irr2lrrrrrrrrrrrrrrrrrrrrpr[Ji!!)!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!3!![2rmrrrrrrrrrrrrrrrprh*8rrrrrrrrrrrrrrrrrrlri`N +!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%$!)Irr2l +rrrrrrrrrrrrrrrrrrIr`2`!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!VNrrl +rrrrrrrrrrrrrrrrr8LVfrrlrrrrrrrrrrrrrr[rm-!!#!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%$!)Irr2lrrrrrrrrrrrrrrrhrm8- +!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)!-[crr[rrrrrrrrrrrrrqrr8S#Z$ +rr[rrrrrrrrrrrrrrr2pS!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!%$!)Irr2rrrrrrrrrrrrrprr&$!!3!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!"!"Trrcrrrrrrrrrrrrrrrlrh`S!Z2rmrrrrrrrrrrrrrrrlrji +!!J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%$!)I +rr2rrrrrrrrrrrIra3J!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!+$rqrr +rrrrrrrrrrrrrr2qf!!#)rr[rrrrrrrrrrrrrrrlrh`N!!3!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%$!)Rrr2rrrrrrrrhrm%)!"!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!+iIrqrrrrrrrrrrrrrrrlriF!!&A +rrIrrrrrrrrrrrrrrr[rr33!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!%#!*[rqrrrrrrprr&"!!3!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!$!%,rrrlrrrrrrrrrrrrrrrhr8`!!)2Irr[rrrrrrrrrrrrrrqrq +1!!-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!) +"!l$rqrrrrIra3J!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!Mrrlrrr +rrrrrrrrrrrrqrrFH!!!#brrprrrrrrrrrrrrrrrprpS)!!%!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)!$FArr2hrm8)!"!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!RFrrhrrrrrrrrrrrrrrrhrb!%!"!# +(rr[rrrrrrrrrrrrrrrrqrdm!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!)!'YErr[&$!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!-!8Irqrrrrrrrrrrrrrrrrqrq'!!3$!%Errrrrrrrrrrrrrrrrrrc +rUJ!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!-!+1Ie33!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J#Vrrcrrrr +rrrrrrrrrrrrrrd3!!`%!#q$rrIrrrrrrrrrrrrrrr[rk,J!#!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!2NF!!`!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)!,[Vrr[rrrrrrrrrrrrrrrIrI#J!"!!- +!P[rlrrrrrrrrrrrrrrrrqrq6!!-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!`#9rr[rrrrrrrrrrrrrrrrlrj-!!`!!!`"(rrlrrrrrrrrrrrrrrrr +qrr%N!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!)#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)!*I,rr[rrrrr +rrrrrrrrrrrlr4J!$!!!"!!E8rrhrrrrrrrrrrrrrrrrlrj3!!`!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`#8rr[rrrrrrrrrrrrrrrrprp-'!!%!!!! +%!([rqrrrrrrrrrrrrrrrrrlrq$%!!J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!)!-IMrr[rrrrrrrrrrrrrrrr[rH`!%!!!!!!)!*IIrr[rrrrrrrrrrrrr +rrrcrX!!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J#arrcrrrrrrrr +rrrrrrrrqrrBN!!)!!!!!!!)!TIrmrrrrrrrrrrrrrrrrrrhr9!!$!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!-!92rprrrrrrrrrrrrrrrrrrcrT!!#!!!!!!! +!!J!prrrrrrrrrrrrrrrrrrrrrIrE&J!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!"!"EFrrhrrrrrrrrrrrrrrrrrrrim!!)!!!!!!!!!!3#hrrcrrrrrrrrrrrr +rrrrrr2qJ!!-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!SIrmrrrrrrrrrrr +rrrrrrrcrYJ!"!!!!!!!!!!!$!%ErrrrrrrrrrrrrrrrrrrrrrIpI!!3!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!%!'$rrIrrrrrrrrrrrrrrrrrrr[p&!!-!!!!!!!! +!!!!"!,Arr2rrrrrrrrrrrrrrrrrqrr!b!!-!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!`!am2rqrrrrrrrrrrrrrrrrrrcrY!!"!!!!!!!!!!!!!!)!2rrrrrrrrrrrrrr +rrrrrrrrprp)8!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)!&G2rrIrrrrrrrrrrrrr +rrrrrrrmq!!)!!!!!!!!!!!!!!!)!SIrmrrrrrrrrrrrrrrrrrrrlrlN&!!)!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!#!!@irrcrrrrrrrrrrrrrrrrrrrcrR`!#!!!!!!!!!!! +!!!!!!J!PlIrqrrrrrrrrrrrrrrrrrrrmrjm!!J%!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3) +!S2rmrrrrrrrrrrrrrrrrrrrqrq`M!!)!!!!!!!!!!!!!!!!!!`"errcrrrrrrrr +rrrrrrrrrrrrlrj3!!`%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%$!*Erqrrrrrrrrrrrrrrrrrr +rrrcrF`!$!!!!!!!!!!!!!!!!!!!"!!,#rrcrrrrrrrrrrrrrrrrrrrrmrjF!!J) +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!#!J#8rrcrrrrrrrrrrrrrrrrrrrrmrm-#!!!!!!!!!!!!!!! +!!!!!!!!$!$Rjrrlrrrrrrrrrrrrrrrrrrrrmrk%&!!-!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`!'S2r +mrrrrrrrrrrrrrrrrrrrrr[ri0`!$!!!!!!!!!!!!!!!!!!!!!!!$!(Mrr2rrrrr +rrrrrrrrrrrrrrrrmrlJ5!!3"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!33!%VRrr2rrrrrrrrrrrrrrrrrrrrr +mrhJ!!`!!!!!!!!!!!!!!!!!!!!!!!!!"!,Vrqrrrrrrrrrrrrrrrrrrrrrrlrp8 +[!!3#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!)%!#l@rr[rrrrrrrrrrrrrrrrrrrrrqrqj!!)!!!!!!!!!!!!!!!! +!!!!!!!!!!!)!)q6rrIrrrrrrrrrrrrrrrrrrrrrmrr&I!!%$!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!3"GmIrmrrr +rrrrrrrrrrrrrrrrrrrhrib)!!J!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!4rhqr[r +rrrrrrrrrrrrrrrrrrrrprIqM%J!$!J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!`!5SIrprIrrrrrrrrrrrrrrrrrrrrrqr[e +'!!-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!G2rmrrrrrrrrrrrrrrrrrrrrrrr +qr2rM9!!"!`)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!#!`!!8q$rr2lrrrrrrrrrrrrrrrrrrrrrrrcrG3!$!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!-!P2rlrrrrrrrrrrrrrrrrrrrrrrrqr2lrXL`!!3-#!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!`%!+,(rr[cqrrrrrrr +rrrrrrrrrrrrrrrrlrj8!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!#X2r +lrrrrrrrrrrrrrrrrrrrrrrrrrIcrpT3J!!%#!`%!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!%$!J%!)CAfrrcprrrrrrrrrrrrrrrrrrrrrrrrqrq[!J! +"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!0[rrlrrrrrrrrrrrrrrrrrrr +rrrrrrrcprr'8+`!"!!-$!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3-$!!% +!*T2brrlmrrrrrrrrrrrrrrrrrrrrrrrrrr[r[`d!!3!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!J!5arrlrrrrrrrrrrrrrrrrrrrrrrrrrrlmr[riVNm)!!! +!!J3#!3%!!!!!!!!!!!!!!!!!!!!!!!%#"!-!!!!)5Uhirrlmr[rrrrrrrrrrrrr +rrrrrrrrrrrrlrmJ5!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`! +@b2rlrrrrrrrrrrrrrrrrrrrrrrrrrrrqr2rrrpb13!N!!!!!!!3&!`)#!J%"!3% +#!J)$"33!!!!!!!K"Mphrrrrmr[rrrrrrrrrrrrrrrrrrrrrrrrrrqrr)&J!$!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J!4[[rlrrrrrrrrrrrrrrr +rrrrrrrrrrrrrrr[prrrqiU9U03S!!!!!!!!!!!!!!!!!!!!!!!!*,@5GhIrrrrl +mr[rrrrrrrrrrrrrrrrrrrrrrrrrrrr[r`"-!!J!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!J!1XIrlr[rrrrrrrrrrrrrrrrrrrrrrrrrrrrrpqrl +rrrrpjEZ6G&Fr,4m@%"!@(bdr9h58Zq6mrrrrr[[prrrrrrrrrrrrrrrrrrrrrrr +rrrrrrrllrl!0!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!J%$P[rmrIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrhlr2rrrrrrrrrlp[6bm[6 +fqrrrrrrrrrrmqrhrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrpr2q9!`%#!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J)!Fr[rr2rrrrrrrrr +rrrrrrrrrrrrrrrrrrrrrrrrrr[lmqr[qrrrrrrrrrrrrrrllqrcqr[rrrrrrrrr +rrrrrrrrrrrrrrrrrrrrrrrrrr2rpG!!$!J!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!3-!4HIrqrlrrrrrrrrrrrrrrrrrrrrrrrrrrrr +rrrrrrrrrrrrqr[lqr[lqr[lrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr +rr[[rjdF!!`%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!33!(VVrr2crrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr +rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrcmrlXH!!3"!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!!REhrrcprrr +rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr +rrrrrrrrrrrrrrrrrrrhmrrKl!`!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)$!$6'rrlmr[rrrrrrrrrrrrrrrrrrrrr +rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlmr[r +*0!!$!J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!%$!!4`mIrpr2rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr +rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmrIr`F`8!!`%!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!J!GRI[ +rrIcrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr +rrrrrrrrrrrrmrIrmSL!!!J)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!`%!1E6qrrlmr[rrrrrrrrrrrrr +rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlmr[rrZ$N!!3- +"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!J)!!$qjrIrrr2hrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr +rrrrrrrrrrrrrrrrrrrrrrrrrrrhmrrrpZ83!!!)#!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!- +#!!!cT2ErrrllrIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr +rrI[qrrrfT6J!!!)$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!J!!)(M9rrlrr[[pr[l +rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlmqrlrrrrCIb3!!!)$!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!J)!!!C&NGcrrrrrr[[mr[lrrrrrrrrrrrrrrrr +rrrrrrrrrrrlqr2[prrrrrq'94!B!!!)$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!)$!!!!#85'bIIrrrrrrrrmqrhprIlqrrrrrrlqrIhpqrcrrrrrrrrjb)C +$#J!!!!-#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`-!!!!#(%q +'Yprhr[rrrrrrrrrrrrrrrrrrrrrrrrrhhlH)9b%"!!!!!`-"!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%$"!!!!!!!##T5FC'Z`G6Qm2EprIE +`jY6"VT&a8LN)!!!!!!!%!`%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!'PM-$J!!%r)!!!!$'T3)#!0#SF+!!!!&'CdHA"UF$)J!!! +!!'T`-L!!!!"2DR!bD!!!!"CTD'4b!!!"!!!!!3!!"!F(!!!!!!!2BfpXFJ%!!!! +!!"!!!!!LBf4PCJ!%!!!!!!!"!!-!!3!!!!%!!!!#!!)!!!!$!!!!!'T`-Q2r6rp +4!$)!!!!!!3!!!!%!!!!!!!!!!!!!!!%!!!!"!!!!!!!!!!!!!!3(!3%(!3%(!3% +(!3(rC!!M!!&$FQ9KG'pb1L"+BA03CA)J9Q9bFfP[EL!a,MN`-#iare)!$!!!!!% +!"33%!!(rA!!63%")5&")5&")5&")5&")5&$rA3!8!8"!5%K35%K35%K35%K35%K +3red!&!*!3%K)8%K)8%K)8%K)8%K)82pG!"3$3%")5&")5&")5&")5&")5&$rN!! +!#J!!!!"1K`!"rj2IJQJ4(UIS*!9A2VNGDJF$DQF&k2V3jX2*+aY4*'MPIZ5cliQ +l+p#8U(e%j+6Gq9ia5#VLYS8@2HmiBpP!J*C0"EDqld*[*[l(NGCr1GZkcpq!+"& +39+0[hi!S%9"8SfrIJR!4(FFaj#dXmfmB1GJDK8XX38#2S#rc(,NP&dihCdLj3TV ++8JXY"aUaI3-i[KeGR4FQ6MkD4b@9pJUkLSZK@H[GEM6m!D%HJaTC2%@lM6r2`4j +q#42c5J,pFYB6lm'4$!1%Z9G&!Z-)jl)5mZU8K`fTmh4Jf!`K(DYhIQ,84pDA)lC +lfVMN3))D*cG(1ZZ[%dSfM$k1V9H%lrMepZ9r)FkRN!#M&Uj$$S'3!-`Bd$,,*'" +,B[1LX6(9I818B&l*eS,2p@YBSPJN[P4dSILUl)UCQkQB28j%!0&e602,fUHKN@$ +IjS%(EEp2j`c$pE@C2Srp59h+N!#Z"LGf)S&E8&4lI$8IdYM+C#-QMYKSARYaQVI +b!)J'hUhDk6mR#meX,iM$8e21!m#k2J[ZUYFD8#J3`6Q!J-r")Ri)dIJN!!,pFYB +6llJ#e!F!F`F88CDS8)e+e[C`2,J4%A5B0V,Y-EM6l,3fL!4mH%+JNP1`I1,21p@ +6!r1V`qP+F110!&H"JB5I-mN8hb(1Tj!!ScAPP[&iPmrN6MbKf5LAKLfaSD8'BXZ +6fI'Lq0b3!'M8e$#U,LR0%"'+"`Grhd&N5)Hc%-$4-eXRCcS[bH9q3PCSY`dI+X5 +Q2*R"rf$VhP%+k,$YpiT62&ZZ#('I"PKjamk-*C4-!($$j`eI*r6DRK*kA2'-mp@ +bcF6VhPSlSDPQSP&e1p32(@crIpqGXhjfT2cZ!)VSeML!c"TTKi,$B%k[HS2`P[C +65BNLH8&m&![&S#!*SL#!95DlVAEIq$ciDb5+3AYaPp6FXHb0`Z3T0Dk$Kp+&S3F +4$6D0Nr&aT'-M"&6"GfB#B-EFjKZJXY`hj"Xi48EQH`eRb&Pj%4UU'FRr%m9%*9' +[GaU["mK6cT!!YN#095*[H'KLpVk+J+Z3!%dJ8Ufk,Xkf&c1V&N)`&IL"USY0H'$ +`P"b(EJfBMS),b`kV1UCGbEK63VS#RHIDGCIfPDKeViI$c3K$$!IRRBVqH@J8r&c +A53hPk%cQ[k,Tp5eEDQeDm%reAEA&N8X"%efY+&4,KahNHME)lTMAfaERQG+H'dk +(!ZAZN9)2C@H'!(-TGTUXBNR'LY!CQ(*c[h0HKP)#'RX`LH401"mmfN8f1hVi4Y' +EqI'VX*KP4-rhq+@l!Tq"X)2C'(-,(DQ'#8)rb$46FaGTh9#bBm('J1K@+e$K"qm +UE`64MT0LFU(H3l`&P4`eGk%H45J'L326#l),pa*RFEki%Gi3-U04"BrmS-8C1!a +IHf8mbMk5k(rrFY(!'2)R,`kS4$6ZHSmZ#k&r9ZS%eih#CTFT8YEmD[E5iI-C$48 +@eh[KET60ldBr40@E-k$HCZj!'%CfT`5%N66GJCY(h43[VULH-F0$F,,`SmZ8h-A +ZbkQe,QCYFXq5X8!Y)@mifXMVUYmUcGdUM,%eYR%hl9'bdcc@3Zjh8N-F()UI,#P +DJR-*V&3m[GDQ'C,5N!"kNM"jQe%[3%JQ4fKi,r+4P[mIC-cjjYUNX[5dFFeh8%+ +V+[T[@4PkmVT@&)PQf5Y9M!B,I0!"`eTf!C9b&b*E1B3KUJkBmB)$h(cFYZIK[8L +9rc)0ehXQeD4!@"CrJ)$IREPqGTcmlG#+k0BiJ-VTRFTBP#q&R,XV$BDK442&'pZ +8FKL2")J-6cU!YqhEDkQNk`BSqdS9i4e(&dT`BSVIaab!j4kP`TL,RIM6U6h&Xqb +KC&'@LJ%'kkR1E$J"p6%$CeTqFX$dDKYkE8,8fmSdYFq'9r0i!9fqd03+1bDdJ8% +#N3'4ZSpk@mK[)HGVK!iYY-NU#`fH*KcXfV1!qp4BLaE2NN6F'"(iJka#%'[ZNI* +j%cl3[@Z3!-Fd!j))Hf02bJp9!XDPeK`dC2mf%U)aDRkYX"T3@1&*Lp+Jf`Blk8U +*6U@'Ik,Tp5e"bb-EN!"MX&NPiD(VKL28p8'$[a+JAXB5rATUbJ"-SB85Y"A0Bj` +IFLJ`QZTKPFHR6f@iEl!JdKV(PiYk"Jc@cmSMUUaTA8SF`p%"%GT93Z'2#5VBAr0 +Qk[VZ*"CM8Kpc6Z,91e2'l$VTAh0l8a[`pqF0T`F(2f9N1iDPF!)G`VR'F8DJ'*L +i!`@@mD#+c1Ljm4b%%+TDTeMq3YaCX&-VJ[NJL&(&H&j[9LhlX1j2rcT3Dfd$m5D +ep96Adq0L@N4pVqQiSdY6()bQcJNe&lKl(RG01UR%!)4P1pc!`,6*KBYL+rD66-q +*3V63SKNKlT28S+3%2dLH4FB[hRi5PQVebpi(Sji1i9#GE!0$p5X941dL*"mC(ZJ +8()!5)Y4FLkR4[IACk`c!QAi2H9BjBc"P54dKPHQFBdTd3-q-!rD)@S0+aJbJhM5 +Aa$'[*9f3!*8mR1[HDhShV'm5U9kS4M`+H-+bM$EYfQALAK4AXP1@%*mFH@eRmmK +Uk$,*m#`bKmm,P1pHpla,A5m("9&@SM61Qrb463BakE6MBld3$@i'#`'-p(fjVA) +S2RHX`QYrhjp$&qI3(2ck"F2ZV$6RHFa+3'`l6flj%!-)5jPNiiHJrG5SKC2@(fl +%k+Qi,4JfhcGQP[G0NiUV&N,)c+GfGqPHrcm`cEB4IiHfr"Y3G%E!R1)9)@A$e3A +NVBQpmHIGbCD'b8$$XI%CVB"'a%3C6fJaHJdH%6GI50,b[#*[AVjkV+0#++8&AA$ +'K#kjb`Dd5,IlmYMB&+D*ImAM-3H#U(5crCT0VUX'pcA(6Q9C`S%fYX5LSLl8hbh +ERE*jVZ1R)'J%kA8fMECI)MLU[er*`(MDp@lfFm%(5Qc8#!K+lmQ8j*5%aSUJpcG +cCX[1q3ClPM"jb5Ie9FBb*K**YQhfSL-)BKE@5"!K$[FYHT5VK@!Pm#+aR-5B(iY +!Lkl(hrQMRKF42,kTH,rJ4MpIbB@XlZ$(XHY35T!!(1Br8CV[E1A@$"L@k%fDYr1 +,LUFR$%FMX6@kV[d8,RC[q(AaQ8$5ifmZXm6D2Mcr3H0AM"0$XY"AjI!L$$lUCfP +Im,DDMpeV-+,B9&&`"B2NjmRMYrQDB$#2Ajpm&Q#cL%LHQcH+Fep%d'JJ'J+d(Qm +10-ed8i1kTeimlhLa%G'Cb"UE@Df&,c(VkB@ebV9FeTCSq#P($r5e`%+&6*XAZcM +c(5i3L3*9c,23TVH$YrcHG-0![5$HB[pqNbkAJL(h%06H#VVQJFa5K@GUEQ'[T4B +l9XFRI)UH1)IbVX)qc+lb-q1qB$XL[ekR[q*#m%$hV'I@*BcFMfC@Lqh,YL,64!q +emkS[a8(1jL58FUhaY(aYa!0S"[PpXqT"ZHf,)"QKQFDq3IPi5*S&r-lLI'r9-4& +69qaJVk)5V#@FB2,R3U1(,L9c(Vm+mE'b0%DU$m)k4a$Q'GAh0hfcGqA)")+,F[9 +"4SFH(B1+XDkh`N@2caI!cTh-@,EfSK,dT1ki"),4-MHV66r%@86bGc2-+c2kZ2[ +Z4I,)*m,"3!IjM*B@[3%[$)3P$kZq60C!,Y&@ld*)%`b(jdji)01[@"Nl"("mDp) +f#XUMhq,a9$PP8&Cq-F@3!1FJ0GF"Zp8LD$l0U+JfYN-JCPjRH1Yf0+3h9BGBpPd ++Z9G`AU$MMJZ`P$0UIGpAARa&d"0f%Al"8VKNk-1YMX1M5HL6PGb5ieGibQ@$YG- ++b(3H-aV"Aekj"4qR#klf[qZ(q'XQ!UYk0b6BFf-@k'K#3qb%&"eR5Q,fLd(9Y4Z +f2%j9B$hmN!$2F$$!I!fV91&hQh+A5fHb`RYaG,$2Vj!!j*caL'PR*2d`eUZ)"I` +K2EDKHJpBkYR6T&q54DU[ZBZIM69R4ehbDT!!TN0A5#JkPlNbfdV,I#q06!YMF!M +0p$(MSiFP,FlK&I+Q@9+US,3NX4kNi(bm00B'Cd%@k$l[p&-JjXJq"Im[L'J!rZk +N,I*Nka@0!BJS29"8@%%cIkN@m369@Y3R'A*iGCh*GAlp&XdZ4M)9+X+Qhj,6&a9 +NIc$FCf,UemKcAMB``[*i9H,j96Th@Lpi6MfTHqkQeJ9Um(5eS9dd)ePXJ)616LB ++PVX4i@NM(aYdIHV[G3r1bT!!r1RKFBM9ICXFX+51klfdk3p`&2+e#PXRF,ilAfL +2RH%,&-8Fm9&$jI[&S#cDMX'6AEbN5Am1fEh$#XSG@0[KZPBH8,EJ5@EU1TRbI3M +(BMH"Rkf-M,cZCLq)pV$qYM4)F1bbTMc2iN@RYF*aU8R5C1H[f"1`#jlaYFS#06U +F'ThK032-ep9chN4qYP%98bj)&RM+cCkp3#-Db@ZkSh)KEcj,1ZBS[$$mT1e"aM! +NLql!"mPD%Lb'')+'Hhh(11MDNJM(`eri6He0D*ILcT4)G#lmGCBCe2p6j"*'H!3 +[C%jSL324cS1U#K(Sa3)U3N3f91G9-6&&rF"AC)YPU'9hD1J)-+&Aqr@j*d'-FHf +M(X!jDr@dY+1B`YG9UQN,A-b@j+rGq80lTVe#4qHJS%P8F&-r"TKpM*Dab-1fIl! +km(MjHkNP$i#Z4KqCBLNS8VpjT5k1A19b@C4-4FrahMC0MCA2"J9LI#'fDJJbb9H +"+E$bj3CYLQ6*UTiReMAJ"eQbcN)Bdq,AiFE"X1L'YVK345ZCk8iZk%q@K%iH!ah +N'B5`rb'MJ)$IRd)hjp!mr2S(`qkX01Gjc%T!E+E#lk89D1)$Z[6fqd1m6R2[A`B +&Z5b2[aFlere`Ndcj4(cEKB[Z`&jM"m")[UFT0200e#ak)IdU@%FG'-!,Vd9P$Ai +`6)b41b#ELS1h,%B&$'NJiYmMiK9$c0SQTbhU8dmAX+rYYN(X!MM&&"8hK8S*B93 +abPHXP!b`Q2-UiH3-(,aGI(QSYVcpp#,NN!!ZVZhY@b"M*Xi"VPbj1b9e4LL3!&[ +KaQT0lTf1MH-EYl+'c!-$KHGh2P#"'+pIbRV9KBYQeN9l'eP2lYRp&9S*hLb9GE, +-rHYC"`lmYlDhDdA#6S3SjJB-4da-jbA[DdT2@29mNPN!Db###LbG(5CC#2N!kqc +bH&QU'"*!DN('YK,Y[QGIPf'deYPY%&V8&SEfYVq5P)!L0fKNB@1MjDBXC53$G6a +rJ%NFFe(Y'KFafb4AURCk+F3MNP[Kh8i,ING0hDFfXPq@J#a6EHk,*UX[pGT38Dp +HhpJYVR4%-NmGmfSmK")a3JZ3!#4FlZbJFKS!F50H&NC'E+Z2l515`@b10BjecpD +iJYC#d3afUhUl6pk6*3kEMBk@9p!-jkr*%UP)@6&Z0KfE'5a"F6)E('1im0b%F)l +36TDVdk8Mb`,P5JbJeqa,U%S4%@IfQ$FX6YY5)2V1e&--3G0bBUi'XSFQ-Z&BU#% +ThQ2'FG1Q4H0E1ihRARZLQV&F*X'Y`q*#m%$hV'I@#I#eZ-P$JqEr@"54U0d%-R2 +AJV6eNpY8qS0ZM9@F"J%28#kiMU-Cd3%P#EB`KDh4p8m!Bj'9M2e0Zkid+`'c1TD +F&aaB&K`L6[)E8de)`Q`64ic1BY*!8+dc*@!9Q1*&qLS1Y,)hi&DQUIU"k(p%EDh +DZ(dVKShV1--NY*6(rXCj(FLmXmfPIV#QKRhf&4Ic*e*KjU%AR66Brb%!`8kN+FE +,PH(C1pB1TQ+p(VGXrIS*VbBSqGR'UdZ1&)29"H9HSN)(be8Ik*fHh$$*BIL!cfh +YK)jhYD`QhmKTGK0GYm&4Gh8)p@-p-jC+LA6YFPa,'+&DRZDK[DU3!&!PF"U1fSa +lR3&3l!+Q'J@e$ir0@FBLi@-*kPijhKNlG!'E[r(2Zi8hG+fIZ4T&$bKN!4!bSAK +Xccqd[+k*Y!90JrX%9)@pVDhj8@c!5e`k0T+Tf4e"Z4Xa0@#N!T!!YXkHNH5P6F9 +qp'MHAh0B"Pp"I2G,IP%A62ZmiA!%+ai$R`kF8,3!aijbXPIYAm,b(2C%`Li'p3k +bHVX(c8ACBEL1N!#QMQM5#J5GbVma"pV!2MMBHQ)`#Y-2`L@qAq#l*e3f'ZEpiHG +2i+Q#%55"68Cqd#FkpNY*Bmc0pV+j2,jml@+[aIm2b6XIAiY%[`r*KG6GQBrErdU +4T``&20GbMEQ-82[AR#1cJC!!RJm2GBTr0-3!QibNDI+kk)@SaT'Q3RM0)P$e,#K +00GHZib5@VVDaabP$'`HP0eF0!`GYrcE,KIMTj2&R(f!E8TU!dJJf&"XVLZ'iTGZ +Pr(@))`eUHY#lchRd,XQ[dPe0mXG09h30(dhadX,eCep[9SmrQEpN[40[I9mM[kG +U5DAK5*@D!3'aL$e)f5*eph[rG&SGPeM$@dq+I%!4qDNKj@j@"'JDh51Qr&"+K!V +N43@YEmedhqer6l(@D((hH-FC#'l6dN0+fi#b6ki&KRZQIH5(%l,ki,F4FA54RA3 +a'M#Re3Ir*0Md+NN!(9RYD@b%-JjP$N9eV[9p**0TV9Sae%BPU%-kElZ`fJ,T#0Z +U51eEd5pLR5UqE3pYhFBkj6DT-1rL1S-GBCP6L8-(fLdC,JJaLmChqCF9$aI@f,# +Cpa#KMH%M%Fchij2ZYYiaCHR@ilYm!Ym$+9!pj&[34$q9Am5bp5C#'@"A!b(MhJ9 +GJXBUIQFI&H5a$MYV['mC$6"9mZTIqpC2A-4R6&MlaqEj-9cLbPXH,ZKL'PGlI!j +K&akJCpMh&AqrbVND8a!aX#GRYF@M%Gf*KB#'3%pjGFXf5#A13m6P'Z%hKSmY0&3 +21k`R5$&NYRhP'GNPi"ajM0ZP!2cLLD@VF!b5dbA1(hZ0Y`4U+SSJAN1`38LfV@B +ImkT1Jb1!I(rIRk&0qIIa(iGh`1rqHc@pm3YTLR(fd@qQASVIY9C(4Y%%NhkIVD2 +[J'k3!(9'!Xk-1*Zq8jdF(6EVf+Ha*#K,jNJH`Eip-*)Q$!SZEbY1k"Sp"RJiF[f +jR-b0f!i-(4@STRr%hX$h8,f+h!%d12*UqRXV%D`8G!r"G"Y298(epPkPjCGEXC9 +*k@[0r%V[2F11!6CGIrUHM1H-q3r(U3@XSUYbNJdIJQX"!a6d[rCUR+c%JNHL2Q, +&L$UKKGfaD-&r[Q*K!12a90+`f-bV+2fpN!#k8!95b61SNJ&aVliPjT'#rBT*I96 +rI0%lLff-b#c-ATr$B5iD#jBmZC2ck'!&,S%SB!lR,ciq,fa8,djL*$0XTcSqpMF +HJV[al''I"Ff9'aE)@-0m6Y1BAlkFIBR5X2`VI,rLkT!!8(p"G1[AVa1SJ5#2lJN +19f[Are"M2mGZd3[ZdmM*23&`9!"PaQ!DL6-8i8@1J4p"H2l3D&pY%"Y8T(5+UV@ +0DNIc&j4A"6&Cf&N@XeI)K#J[%TRhKrcU)4-"F($36,`ebHd+#B6(hPMpcV#)L6U +#aUq1!pbNHT01PiIbB9#UrA[,f1X#5T5q2K19R#d%`B,ZAaHM4Lfkpd'hA[)FkH8 +LbU)YR6)mLD8r(MQE$*rBTrZkH(B06ah3IF+p4,%ilr8"dfpFfhRePbQ&FZqk8id +#NTZR%0jKS6LJLA5Bc@qq"UmC#Q@,9R1TYYm+Fr-UVfP!ql"%p!T$Gqep8@FS35E +5Ed"b+S"Tae+Rd(UrXVNTh%kUXa(RL$S!#DpUGbhGQQPiSAe3brR63rp3rNTlMGF +AAb#Uk@@PQMJ[j&F+3Y2iHB`X!eDLl((FUjU2(j!!X)pEYJV$P$lHNALQ5G'hRI9 +($GY(5IT%L9rmeP`MBeUcR$LKIcIFb4cCK0598H`EMa23mXhF@hf"p"q[[%kP[Nj +LZUEEYi46,VIkE,0[9B(E902$UCaENK"'92F4Xer8'"FQ5T*(iaiP!GDi*&@SNq0 +F&!m9[jKT2afp'N4!9H-KLbqNAKFNPYd3+T[5C`+"Rr@!Fc&M-R%YrcDi%[YRdrJ +#,j+,pRZAYIJefMiK&Rc+[(%K`Z'K`F+1@5#D-66&Q46%(5#BFLXCA!pREQ9BB2X +Cfqk-*[B2$rB-0c)[#,$c4cJ)'[!"Em6*80hJ4i"*aZHXMZp@DGk#F3pZc[9+RVf +j%pD1ZG,VZ5G!pN,NX8RZ$9L'D8c'!*`BlJrm)"5a[AB"&DN#pSHGh3+3!0KBDUZ +6R0R$R3mIq5lJEVHNV'K-"PDB843JMNRV@"BLIIaHTP%ArdDr#,6bAfHD$EeE155 +)TR[r2$K`+JL,qNF!K-,L#)"Fq0iQEKDpSfLZ,m8j!3+T-RRQa1ef(q%%#GJ5T!k +R(r8G"'A1fY2i(6AaZI'LJ%S#kU(4GI$@2Gm!DcPdMj!!IrKY%YpQ2B8F5hreI)- +HAa[IA0GC2UTJcV5,MpMYI@MYkb1J0D+6UIIik'fJ[C9(AjbGb6ZV!4Tf@bASpN, +[NpGME[D8!I0VIl6pdZMV@c0"*eek301D4RY@"fY(8A#%p)&iA!'4,6C4#if6Eid +UqLi5fDHea&#`BLS+JVjU[LcLH)pSTXkcrSXaH%LlIL6INFHIp"Fm`YiJdfE6$Pl +kMfIb61EaNhS@0rk"0N$dm#fQG[J+KQ3R`a,S1&a%hr)bBd@[9e*q"miJf1!GbIP +bNchMKDUfi&"Q)"la8qKkBpIX0Hi*#NXTea$R'NQ2+U'DL#%&Qr5QSDYB3r0mJd' +UB%AHITJ[aBfk"d-rV*20VS2'[!LpfpJ,D,$0K`FIe0%di"(`)56"BkG[SB!KN!! +!ip9C(149FQ-q1*3IQk(3LH`DQ*(d`1X!B$jBC"X*rhRLV3aXU2*qLTe0q2KJq!# +-TLkaJ#e6R*@[VN20Z8qUq-IJChDY@`'AplIcBdHjP4QDb8)FQ*-SVAL5[!*ZH'E +G3JpCmDppR5*E1a9`BYaYf4Y23V(jSE5&l0l2J4#19JC6!-)TA0(G$5aN,IXX%PM +6)BmY9AhfGj(ZCqp(K*jfIN"RS$`iNeJ#k!GrpMjecP,PhPRYaI5[-HrSZm#0`@Z +%ML1++03p8r08iHLS2Parc@DR6"GRe!8BE(4kp-6S0jB)J!RVCi1M0#e9NU'a"EM +`"Z*[jpH#&k(4Kl4V#&XP4fm2rC'ThTSafDcppaDca(pHLlJUJ@(9C6CLq@mQUN% +A`IpI5J&cM4&EGm+19flN6QBl3XJB5Mkp++Kb+'[K(&b&mZU)Ya@jdMfpqN!Mrfc +qUdl8JR61Bjli-3,Th*!!U!5X2I!BP#rj3#0Ch'GHPcikKifJI$XBSlY$VY+le+Z +iX4NqKG4NHGRmBK4pIPE!FNhiA4[3C-5K#jL4-C`+pd3p)@(l5Aqq0!TmhTB4VH( +5i,(iJZMqTIVZdm`Rdr$$Da(!hYDqe5rZ6H$p6"mHI'%Cq344!aJQM0NrP[F[S36 +3X*leEhmL`Lj$d#pm8ir,kf*DkD*F%mfNH3Ip!f3KQjXRR5S%)EL3!*!!&SCT-Sj +'H+N$#D$jm*9VXL1"iLVme5`FAGU*%[F"li6&3-MK6HbK8MT-e)3jP9Lj"RfZSDS +SVjlPIN#!MKjCibp25)V8db2`J4+*ZDIG"6F2fX-q6)`2pS12HIk-(4G3-Rl#0cA ++M34p@!lZNk`[b0!188Hmd#5#b-hXM&rR"b&0Ffj9q-H9L5)%ZU4-D9U,XMVbmZ1 +Y0a+)Zq3rfTjhTKlB'5r#T998'Q)@Jki#i$CJ%,3I,0fm!e%2R0E8XKU!JYRMhi2 +64XDDTm-HXSK0Gl'9X0a(KSe,0@l,XqpP+c&I(@@aKp5V'qd!bmm36+QepY4!Q9E +RI-L9QEhm2i3$'k$dmlQ#""5F8lZC*6Z#H%qS9Qf,0ih1Jklqb`j$rISJPQ`,Nh+ +V`P5I35`XlR&LhCai'f+$'C&NYC3K@8J['B6kA!9b+@@iH3Lh"aN#A8PA*ZlNSfK +4A1#3!-hj4Y8dTS$6kS#SDb3XJ&PGre!3KL6d)8C"AR&eNL!56Hck-AAkk-%+LBV +"C-fq#54*96qM*")l**Ile+PD0irc32`f5$mUNU,E+&39cIPBVfGX-'r$JJ+A#8i +[G8I(MQ%f4%S3iZ[+%Ye)3*k`U(-"aj(GM",`Yrc6dmR569'F+IhXh3jBrE+Y8#d +c[UlJ5r1R3bQ#PbiSHLRAfJ(+9k-kabC#kP9aV$4,ElM))B)T2'me#qBZi#kfqMi +c+&ZEFUlD-*e5B)ZHh5B4cBl23-Hb4Sl(r!aAX6S[AHdYBFCCVK&FGfACR*rU8&F +1Ta(2iRNVK2K'39Npj$"N2r)B5&Rip50PX"%2(BJeS58iD*DAE8I(6GIkE4pf86r +l(qTfjQ[i$CKMMIkjR&kP6fKJB'F995)chrk)XNbNbX[(60%rNpR!UD$T)pk3!1i +ldB#f"jXl@9JKSIP8*iKQj'$-q)Xc)i%PUmH&f'h$V81#l#X*[-m1AX0X0&i*pe' +H#6+M6Y(XaFNhrcPfDK6H@Up,[Tp'6hbaI8c&T5eVPURGEGB[j1NI*!MPfmbFhDT +jcI`I$@P!cCYZ&l!C65d9GSdMS@,bkH0l$l"%`YiNapi84CKIcFekPclRirUfkh$ +6$@YpHmNXX#iZ-FqKT"eb6"1ImVU1BSj'9mKQK`3dr-r5-jZZJ#A&NaCp"AXTk,q +l(,mp(NI9!-$r&U-B"6-q1Q,FBRS9rEDpA6i[&AEdGf#'AIbHre!q3iJ4'd8+ifD +*JcG8JUAp*(kTblN0&Q5+*cKpXGLkdi$b(3kEU4Ab,CdC#544J*1hI2mM)rR!B5Q +&j1INjIQZZJP0f'JK&c1aD5(ei1``ShG0@&AU+AbLVaEBVElMeSPS%Tj3V6d$Y#a +Xm@3FilqR(6VG+'9@%FJURY5&bE(EKI,eEJp)1V#BQZiU[`2#p"-&HNe&SEq)f%S +BQ6hr,AXLK#,Xql5IUQJMqlbXZ)T*rh&M5r8c!Y-rDm(FkGaITG`P#4GRCcc2CcK +m4'Acf*i28ZRF2cL&DcZ&"`ck)VSMa-3+A1F2ZcSlbbe'0!)RKGF1L'IT8bjq6i# +!hjqJ,IRh`4q(Gd$`#XdS*N2ZeNb5l6B$0P8Hjd%T@!0#B6!eKle!ZeNZJaKL-Ac +mJ0aX`rlc+A`k@V$ppJTQr"kT8&ST*FG[)hF1D)%)YCB8Z6@#1h-H*d9qjTLK$BH +a"!!1Kjh'BPP$9LRHpN0SQ0e,![iK$D@Bl4eALZ8XHe(B$hpU&SS6A(`#F%c144V +4CqbGRYY6p*c['9fNEm46QHj@N62hmX&dmcRr+Xk2,em4KXdfVraZi36UH1HY+JP +rNbIVr`dc-fCBBFP(dVrrE"F"rCfiYDSpS6$X("@3!$iIZqP'"qYr(Q4"5pI(+`F +rl@KY0!Uc'Z,N)b8YJ5,-M,%cLS-"NjZ!f)k*cd,CBQkiMXVpaEKX',MGRA($KjG +a2hNSNi(qr4d4qi#2kq1,q,L@F`ej!I+&CMDH[MlHVH8ZCd!3UhD%42bd4)`61"( +B0BjPBiZlNL$i!A"#jKA!225r@6F[LF6T2c#-KT8,fI9U4)"STa&[&qJ3SBGHSp% +DC'%G2mIX*V&PBQPX@251(-@UC,ammQ161bQhTq,APG,Y!4ENELZBJ[4ZNFI@4aC +)$HQ26$#FQJ@hj!#1hG$DaN3,-hGmq[#rFRKhY2diEh$QchkBDEPriPK*MLAY!Yi +TG#c"V[k5*k%QMh6#EK--)Y[+')aIGP4$kYFQAAaZRcpqTbjp)aI&90bbipdKPDV +p&'ddN!"#cPH%%F59X)cPUmrcqD40iJMY-##2lh&V5fdN%)[9YhX54E$j"AiK5ji +2'JTM+iIXl9D[%"DTe`L)6dT@q*@mH!YI*e%D3FPcRHfPMCQiT(!G(5FbN!"MS&h +2SZ'eFTm91UCe)ZDbl%8qi4j6`qr9#,F1YdD+-EiUA9)H"l*[4#N"TpKQe8'1!Rq +Ndfel3#i%HZ,*Yea1*[4hYMEq@568)f[RaHK"!I6Pc*DBTmSp3Ip`$2Tr&E46E+r +*+3MINLDrR!S+6Vk6[HiKp[+0mPTTTUr--k-cEjfm9)`Zk)[REK2qBR@(d'bL(iP +mU"rDJAZLE[J-ArKF33hfZV-2'-aZ&dN`mVUY4K[fVM6Xdc"4&0e4AGV+)adTlKD +lddl!X(Zh,"ihi@*VS3N--AT)PC[@C-*5SUlpRUThJkE9Qm+r5MU0Yc3$rR8PH$$ +Y0GEbZLF[F3@C6$biDb'&-YHC9$eki)G,3+T@1$$E)VaiY-rjE'cP"NmcMZ)AFU2 +lI+PC$X(N62-CZU4NkH9(+(`%'R"AfTQF8CSMmAZbd`IFDiLMkD,Ie3#*ZEX3qYl +3Uh5rKB$6@Mh9rfI5fFrk8j34G-XbZh$VZBhAd))N,8,Q*ESi3EMNb`Q#ACJL3bC +&)dPDq5fQl9"`)H"!K+[-a+q)J6-B$`6"BErh9[Um&`I@Z@AiEMVA&Sm,GY-+'$J +r'Sd9`EMQS(ZQB,54ela$6(CCj0lRKQIfe90i8m&p#1(ifp9Rm#kBQ4raT15Zk3Q +Yd%c%I'9(J(`$'5c61*lL'C4Kr"%VkT[cMaEa-h6L&D-&PQ2TfM@T[e(P8,acVLA +HhH0N4-+aS9VJGhZd[lj+Ifqe1(D'I2Fmr($%45)HpS@KIBN$S1VePlr#)&06GMe +BrP39&MH126V'[!@@EQf2HhVCi&VG3Uri&pm[1qp"19Ml0T&HT6-'@e"J3G[lpjN +pYBkc1lH&#m8Z9$)QMiEG#40DHMQ6$SMe8e['$Ne5"F6TeRV@Vm&VM@aT6Jk[M32 +kbIk'FM+BdTJpF%H+0lrT5XJrEp0a+K9*TC(qDRI5J6!YZC'jD$CM0fKJ0AMINa% +3QeFePKLZ38l%3JHYFVT[r#U*f8EX[0!j4UP1N[aF#Dlp$#QNV)bFkRUPi8p'0,& +E$!5He[U$#L[`Ym#M3Gr0c`U4Z5'dBQ0cGb0UV[VaI(dJ1pJS"FH,Gr`N",mMrEL +G+(Nd!6Rj6k6Nae8SC)SGBYD9E&KhRH*Q+C[8e&4eY,A"G"0R,@4C*d%Vb2k&-0i +&+CRqH4FFShp*k9H)TJ5JB"-J1G#)+9KH%,,HSdB4524"P2!5FUK`i%qbV!&DYIT +"$k3iS`a[!$ikMK[mqUqZTFU1eQDe5*YjpeqHANYZ)j1jcLJ`ajVd4rTcLiA,fSe +#p[L)c[AKV(KZ`J00m4YbGJ(*$&ZpI66RFk2mkB8diRJP!#DEXX20Tl3L[V#K,hp +C"S5Ve&6m3*f3!1ffML3cDda,e#TjIQF8`DSk9&HQ,1IqFC8pH(p18qlC&PF)lFF +!3@Qk'XL`M4Rlf!$4jp[-[4HXUY@UGkPj5k(8E)H3!"&VUejB`TpfaK4YhXEfIQC +MlAi8YMNVbNa8DC!!URHJ%UDDd$38Ip-djijRY!Z4HQ%A`r$5$MX!I`Z1IH!FjcF +G61U"8*kDXlVD''Pe"%f$acLRp(C[[CTfP'Sf!m5B*H5(!(ZR#,-r&@160GUG)R2 +#$QPN+i1`fhXRJCG4[r+TQf*&dhYM4fY6"l(#"+Sh`8lHli-UGK1i*RceX#3"i4Q +T9Fk@[Tb5*cfeUCe(6p"KN!"EV&8jHjj)eX(e4m3,jeQ9T*feId5Rb`*M3c5,[Tk +hq9apaK0NP[('[kGS"e!GlJecdm82Kak&a(`Ucc$JK40+,clTpQBr0#r%Q)"'5md +bBhVd#,!PpHq`pH@j+iR%(c'P-*-$""SJUC0)kd@i3Sk)S((d4*''lVh%0cPaB-0 +Y0Qq&d3-ddKVEBf(A-AB(QPTm'2AlhhqkDDfGTFNp!#A,QqT5UaL#cN,F5B+-pH% +"iUUYX*@AZ6,,lV)hq(KqMDc3"H!K+qmU8p"X!f)&C-h#Np48XpHrC!H6BIRpaTZ +bkPZDkS[(0FH[VL`1JiRq!0cQ@!1&(9#HT)BMffp4#XK9FaPQJF*),$XHJT(HmaK +*$E%%kqAii,`c+6k5h&p0V2M`TF1N`fSKNJ'+3QRMY3-!j*1QL#3SYi))`D"-Y1G +[*j5'dF#qid)5jJaLf'-F#8e"#bZ[c[%ah046U,dLT"%6BbQEm"%Kb1C8&-EJ4"N ++I+22Vj,cq)@U66)-rcH&##+3!%eNPa0SdI$FD4S5Ir*KGjC`+r'K&4`MQUPD1h& +VR8#Lf58d+pkPm*2*9pABe+DUL9,`Apic2md1,eHBY1C"-)X%Ib$LaNSdVZ'eT9d +Ge(e%YdUR[2,%llADb`bRQRC@)2c66$R&F3R&pl(j3cJ"Q))SRr+lP[b*rM-lT*6 +"6,`XLY5,!V!SF,9ii&m6AG+-B4F[D`NPS@Q%DJrH,E1P#ET`0l%L6D8*!bclXa8 +9H+&X,U@jL@RKXiDa4B+SN!"DE,(Yd2eaM1!-C91PZ5[b@d-Q[V*NqCHA4#%M4TL +VJV$-0&"09+[P*85i&9DG*CU5-%lD926+*BPk$&Pr`qM3136l,lG9dfc0GJabci[ +G+F@BNp)Z3Jp'Cj0Yfb,Ke`1X4b9@Xq,Mc"9"i8i,JbrklF-4B,,q8q5ZcIV60[T +9)8-$+U`6kVfZ!aK'R@H5M*pGj6RDRE8-5S@9HF*XT)-Zp#Z@Z"F"+("Q[#*h@l8 +2V8%TUJNkeiC9IR06&65*Xl-Hqb5GJk[UqQRQQINDd+LqV6Yl!)M(BAM(,A4[Vb1 +%"@8A!lC"&l(XSkZYQj5@GS8[U9)qVQaU$mmU`bRX$-%RPD![G*!!b!-DZH3+@jc +q91UE$lF,V,hRr%1V%F2dD546*jlEGjp'$@MM8#LAdRDripV9JH,B![TIN4H2[RT +++5Iq!lTYkSK5GpjlBa,b))*"1)aJHjQl$9,qIdhFbBZH'L8La+FP)rS"hPNJY1, +Y)9@T*UY(%Y64DkImA"eYrU%Pm[!JL5AeYKZACLT'316,hTCei)R`6Y!$VT%69%m +rV$a8r"Y(#SqL#'aYD@(-Nh0IBCl5C3+%)&H'8[j%T@p"r0P`9rT&4**e-+$rIDk +dU'qX1d(BQhp@-Qh6jj!!(HS$UjB*p2ZVVSb&Qm1+j*F`"$XRe0R4d42fHMN$Ql+ +6A["L'`TKXG&Z8*%FR98YqQh1Gj3Ikr$9hqHU&q'R9q'a'[`e)[`e!rRTaIKVrMq +&`r`d&rKSKr$6-1Lb2j)%CHiq3ri"*aYBhUR,EiD6!9DRPJ"*-DQHMZ'jF,-)`R[ +elVSdRbb-3bG*@8Jp6c$UZ6)8ii"-`4c3r`*[e"b[Va2,`b!X64FfITZG)l#[kb5 +BdFDhbj!!*%R1r)RmiL+DHeHJM4,)+1Vp[FmdR6JKlQDGGfL'C@MrHi*qKb-IZND +2If`k86Z1016QbRUB)RG!BJVJY0'%pPID,N)H)FQqUqDEZZq#I""b%#I$-H8S*-8 +Y$h`c%K&1kl6#Q+-5QH4V8DdSb15ZN8`0kGV03#%I8iBjIC)4!%0IIrbUNdRi$Lf +a!2macr!T[qZMrD6N@p&(!fejRC3AlQ)bMQX`rZS!$ekrR1BE+UX1"9NEY@94qj2 +!FqI4dJ(ml`)[p8c42h8!"kpIcR-0P9@(!Ub0fV+SrFRJ1I2Sk3$qG9lMe60%rG3 +!(Ver1F`f99BF#V)hDXUMpbH!jmqMT!2hq!4Q(Q96)D!A#cVjXU13!"8bJrVl8)i +'0PG(,ElCV09$23dVXq'$bI[-BEaH!mJ`r%@+e+rA2R$b,XeL[V(FDF2ckX91YP9 +1`!F6i8DJV2b6bF![*#bX*B2Eh1FI-beQ@+4`4i,2k'0lhm(fUj3&*%LFaDTNY%V +3,p,c-5hA,pl!9Z-1!$A0(1(a%2*%IYS&VNRF86-(IiR!S9",a3,"GRhr#C[Vj1" +%aiaC[%Jh9m8%Vr-UDHX`lq8QSGP%RmTVK0q9*+cm8[DIR-%jeQ53!$%-&IDKrDf +*PBJ5*HHpDRF3$Ub&NT-#rh+e13Nrc10"3![Rk$Ip0"Y5G#BZ@(DKjrmp9Rq#`K- +eZ1lpVN38jRcR[TJ(ZCE5qcB-k+LfXmi,GX8Q152SN!$+&)'k)1KJ(ZCE5qcB-k+ +Lf6amp5CVFGhlA)JTc2R2I6!2FbfPpQ`Cd9%rT3bD[0YPfeC4`je3MeMGrV4-UAm +N0q+Bf2mR,LiqpbF+",,(lj'-!HECP&c@3#[dINr0dGkB"(5iIqC,%26lK*lGfr" +9m3Z&N!"L`!Fck$`,hpaD10kk*jRQ*@I!46(l(GpG(9B[YNIm,U)qEH#FG`I*XqR +Zi&#LJ`J4McI0$'E4rV-%3,5Ip@0'-ML%IAYD$[pa8CXdMU#+iRPV2+h&#"&MX$A +bm@0dNE`4FijZ'pfBV5Uh6NFefM@S`0Jq-[$')((c6,Q+mFjlb!j"'XfIVDh"caK +L"J$1a([h%lrrIi5T#,)ZcLMLPqBKACYA$#9!q89GPKCjJqeX"S#$d$[0$N0X2V% +Q'-0`N!!Eb`DV%I&m&CS#$d$[0$N0X2V%Q'-0`N"[,"JECLq#Xd""k"hQKb'f(eL +6$''i5!hPIjaT%rQ@B&`41ZCEL8pMQi4Yp`PLCM#bDNSCUZhf*0#3!&BCZpHI'*F +l#eHc@B6eL+YNA*%5*-(NE(Y%8V#CTi3%J(bbA9II&"29HpGaXImQV%0Yb[J!jT! +!a5@,Hcf),I)D(DBrQ#QTFUV@qh+G+$fiX*F@R'J+-Q6C[D(mA$RmS(DCG3TGEYc +eURbGDk'H$XG*'pU#2Ki@#-1aJAFq5[ahJ16I`0@fHfp%6A@$f6+iH09JQecDS9! +TI84`Q2[945EFE$ab,6KrR[c`'3K&[U1cGk!%rLHR%DI"&&MiB5G8HM3iAXcFdQi +'D*&SM2Z1Yf-L(3md)[@6&GF-TbMme99YFrprqhC!IR#NRMM8RLkT#C9f#IX6qdD +2USBVCb0Mr,Y-,[pbG8"Djj[C&68*l5ldME8&p()!)#U*A"Z"ldA1!b3R"e6JDqb +h4CFmhXLTU%pTGk4YU#qMN!!"!94+i0`2HLj`'5%i2-`JU+#!YFmhXLTU%pTGk4Y +U#qMN!%"9%VJh!pk,R!C)6IprPdPb!I(c8D8X"q`LUe[5A[%b(,KY6`Ur,6B"KmM +GYfp"@FQXT@$GSAVj,#(KE*L#F'4Z5Re"9+N`6V4J&LU%C)cXR&`Jdkf[HZ%H8[4 +PL#SqdaZpfmbG,F#R-mA!dKJTE)Nbq9P##,VEeK90bKYL[#aYGRB9%HZddhX*!+C +JGbLrj$D6dkUYi8U1D0*f09HEfNpB(DFaAIL6EKYdP!SRF9[$d$H$lAbq!S5U+e8 +Cm@pP#jq2eQkJZc,S[YGrjRNZlLMj"T1G8K5&CE0a@,[@m-qdarprrSM4P'ckJHd +KSF2GCL"!0'F%FXCmI9TA&0Qefc-jiVQr8l(SR`,HMcUVNH"(mXHM[,"*L(QMTPK +bpk'1H+j[e1ak*m#hSmkUj(J4r,(Slb`5BKjSkBTB$d-Fm9cIUGMd6i&[4je9b2! +Mq@24hPJNa$c4[d%FaT!!lJrk1JJVB@iZc6J!cQFp6hQV@`1T59hQIRQmAT*E*`` +Xd%k#+`1C6bCEa,aFefl9VS"8qjeDQ%MbdlrHQaMFSV6UiEYqEaMacdPJJe&H*P) +[bml3q32Zp5rl'5[m!hb9M8h,b1M+[bX)R-LYi1P#fp`B64hNZ5jR"kM+[BfdX'e +H1'6@NMThDd6+q&KakmE'M3qBj)39YJc[!kYQTj18VMThpT(f@VU13fh*mCaFi%` +*'4&20j8X`UG`#URj+p`K6jGePrFGEjHeG1`DIZ"i(rprrcfVXDX36R*&R-TVS"k +HlLk$-qJPbJL$mV[a029ZjR3)L9jRlF9&@M$VkmZI'V)%,ND'VhD!QeqlSCd#)PH +Cqh&49S`kq[,RaUb"#j'KUpfEKX-#)!aGbFjXS%bXF3kq[,RaUb"#j'KUpIL0FUf +4e%Ll5f*mrHK$)TX[C*T,LFreDpPllqi,VrlU-BXqhF#Qq!9#RShLhhkQaQePIPT +XVYNbbXLUccZYC,-SA9liELIqFe1p&E`DDjc%MIBJRD6YYASRR@Ylp+Lpi`Hl-[F +q+rjk%34iff)b3I'kRhF5-jMk%d3Y[+%ZJT%ciZI)#k%Z93(U1H9,rCLSUG-m5NN +##%DCrU2)i(Vd2T[@b'@6q`"H2Jr'CKfiHM0[MZSVfU[bDcj!4iEPPk2HeNTp`5R +l+%I6KCVeTl,1i5q'q09*Kf''pqlT`rpr*VGIcM'3!0+NZ*L4a3,`"[aTe!`kC&F +PNa9ZCD3kdApX+pbrZCBXipXKZ)S1'dD'%bEQ@N1Y&rE#[F[lQ@,12E)EL+$KY'J +E@X3P5(@LrYKAZAqk5T!!QaY9k&26mY3k-A#4!MCiNL&XC+55Mb0"4Ek%#qN+J'3 +eBr`p-j4!ASR8C#aU@F[A8N*I8,NGl8JicaA5(f2dSSC%8%m1Dp4d`3b,jL-DbV1 +lET!!9pR!&[mb@mb$X5@l#!aRIKZTr-B%N5jB1kKe0Ze1mXSRE3)UdG4ZKFNV6GI +FR&G1qkRXdKJ@D&0)5M1`bBf4I+3"cfBrF@Fm$('8m4#9i!P!j)S1SIXEe@Nklb" +J+LbkcE!XMZD+(G-,3hI&Lq&m%qr&JE3aSHUePVQ[NQ-8DM!2hEYdSa0qdK[F[AF +SY$L9(eLF&(T3@i%EejVZ-,l$+'4[-S`QEkEAZ$bEL4[M+@[Y62+BJhA(rdIec0( +Hkc),rPp,)"hMG9`5Jb(haL(rF5$UA)JcVDcaLFdJa,[#GDSj$Me+rak"$F`6U[+ +PqG-QG'PCD%D-kfXmBR0)-5l`R@U13ip5[mp!KZB*eAP5r1Q618T@'M4R@eRM%jT +"LAH%ke4b((U9rRS%0c"1Urd6ZP6,PMMbX6H4!rm,K`2K,Uh'R,ip50NZiY(@K!& +$,)JBf#FF53H9l)0#%2(l[@Mpm4KAhHS)q)VamDlpaq**aZ`Sr8)!Lb3%i"D)1'9 +bdT@L`4rc(lFN0b5[,K*YA5aDPF`EfpSS6URlGQ*hIH#Q@c+h@6#b#1$G'KGL)#U +dBrY[rRD!AIF+-Ifli84H52Td%8EQ33phrhr-FTk1lN@*a`T)e9%RF`1lX2k#jh) +X6X(FJT6kLN3GVpc"FlN@*f$Z38Tp45)1Nr##jh)X6X(FJT6kLN3F-E`,RFLa1`G +b#P2U+4!rARka*eImpG`0XPb[TU0J!P%Rp[m'jkeHMFU+i2iSr)mbM4fdaAib%TS +%bIF9'Bm8drhL'!GSeBCJ-9ESQFHNSfIYZHbHDENUD,fXkr$U-NH&@!X'pr1Y#40 +M%Dr$Qjq-(L'VRBL+Si)6ed8a`e*F,Blb,qF4bD4dGq5aq!bYe286h4iSjrpr-Kf +'%36ULla9*fK#hr2eR)!+S1F#IilJD![C#'608a+G0b2j35$U4N#QXP$,))iTXl- +kB!D5++E"Ri3G5-J8eHeF34a6CfCd`!dN88f$2`JkNC!!+DPqIJMLQcXcTJ"T)ST +X'IK"e)b"66K2i)iTXl-kB!D5++E"Ri3G5-J8[mU(b1B6N!#0G+Aqc1Kb[jE$HpD +cU,Z5`J-b&0dBMZjqCU[iZ`@N3+93cmPMDhJrKBCIiKLqYUp8+%E)YG8qm[8IVQR +9GI&1XHUchU,GA06%MHF1V0VYAr&4SdaZ*&PAB$m`$ADKRUHh,f!0ecZY!UE&&ZJ +5l0'I98J'5a'h[rprhj,kQX2BZkSL%[['H(d,L8l*,QQ"Zm+Njj2CY[prrbQ,8#1 +!P#$,UR`pZeN96V81&8KJdVR'qZj8U1!P#$,UR`pZeq[lUE2*Ba)@ReZU6ik6p0* +LD+le20#[9rG6Cj,'*#dqYbJ4p*qQNa0&GkRQKAUrZTXmPM%KDI@h!XH*qQNa0&G +kRQKAUrZTXmPM%KDI9dY3Q9TfB@ZhbkPqHDiYG#6aeKi2CU5f%V1RBJr&YH"jS1R +6$TrdLDl1l3"h@fQB&+3J4T(fbRmI*X8,Ak)Zmh,04'LdV#VK),KPm5,9Hj)k,Pq +2HI5aMF88cGUmpl25llrE@'5E2&EGl'&V5'q"RG"ZdGKE9`ra*rM'UXVkL'VmCpd +HCk2i39fhjkGS[9k*6M$a,BX1-kSAFdr"%%8K'mK`-4d8@*-3(4XL8hrXpaF+9G3 +&p8TkV!mHX'Vl42prrh8AmQ,b3C9b0JB8kYBX+JD'KiP!mF$IU#G32*C#&A)f"K6 +UeL2*"Q0$a*C9ra)i1@8U,b3C9b0JB8kYBMb3!'Bd2%PPAr*'3p3U,b3C9b0JB8k +YBMb3!'Bd2%PPAr*&MHT8ANJbVNE!`TeDa(NJc'KiNXUrii#!jr$EMq'eppZdAm0 +pm[YfDrKXpr$D2q'q'(lGB[fkfIYeerEYk2)X8NVVp',NXp+rk3V#@d00$2HLTAB +K099%b&3A#kVSqL*-(*VYJ-eKZAXA(a3PBeMY13Ma0$ciUl"$6P&M+26EU6S64Hj +K93`Vm!TZRrP($,JS+PF'9fXB8jIGf)33k%E4[L(5q0,8'[dY`@VDB0,KfQU03P6 +'&qGI&9'@QfDN',#2ALe%QbpK3MX60lE6"2Yie3P4'SB+)aQJd9I9j1"IFMVLiJ* +AaT@d0iN'XBYL)%''6*916Zjk,c6@j6AFj+&*8XdT&mZY([e#+j'XD5),bXSAh)N +*hSNTjScY9"!`l%YQr(i-5H6`PXQIVZHFF5d26aArHK%'8J9((k$#F,54UTeeR#- +%0Mmfe+QXMr49&cG-dMRpYi5Y$qqY)BdB8am4I40l4L,&HT%S*-G*J8MB$BeTLpS +ImG`A)$llXcj$V#bRGMbR[ZB14a"ZRPjJ1fBeN!$6TSbm)dR@RE'qK'RN2k3)93U +pIZjGU*TcG%J1I9RbFJB53j`)-U!prBVeNFIDTNYY8#$d2bX%KkMbB`iB)QIXXUH +Pdc(9B+9FmL)jmp2&M$1fAe08qM'%lY,Z2rcM!Spm)-3#6r&4dJ*DLNdAq8ETGhU +Vr$GUfTMp(j6-c5+2RA49'(Cff"j2Z2DECFS4Q&E(Y6'5,eRSd58#ID*b'DA9PbZ +m$``Nqq6M`Rk)L'$F!pV&!L-@&AD+mc1GQae#JlDkH9k$31Ve,EQXhfq@pk5lHSq +Y`+-8QXDJ$pq#rd(J!+ice$rLm[3N,IZ$[U3aYr$E#[AFYl9`[QZM!E0%cc!TkIR +QC+hr+5Z5%T[mc$rRm0)PB-5ZqMbU0qZ18I18q2B&dK@9U@eJ'Cqih'*2cSQ*QFf +*%K[0!HBTBXDQPJ-b%!I(hfEEK29e!c&''jE(FE05r$VeRm'EI$i[4#bE"MB@-G) +L&fPLc#K9Sj,Pia!Xcp#XEFV(03q1RAVe+[%mNISm&0J6VF68JS9ZS01SFAij"%V +qe5-A4a`pT'`d`HkC""83V&f$F@P1TM9pCK`+13aZ$L(q#&Q8#M&1aRLA'd)6[55 +Qi59[5CH"qF"#Q1f@L8d)[i&J5qJ+fUe)km`@**-F,l-mr`3'eDUMp"T&BaBdNe) +%0M9)0Nc"!"G`1p'59HI01kl)mChX2$-AZL1[G2PX-Yf2AkCi4a8cc,LpZ`4X-*9 +SpKVVBrBRl"D)m&h,$UN5ATb&l94SMQmYJCcAQFda*S*&X&90eQhK)+2,N`mB'HD +@FCb85`df6P[9-YV9A!PIG%9(H*jeH6MjkTRUP&K*ajNa9Ij-qAf6*%Q"lZI1XeM +lfPr8i@i&BhMja!DJe9645@Sl9-CZ8kERG8V4lETZm3Amk$8l[GmhZlA3U!I3EYT +l5N[3Z"ei[80UMlbeBVqLXLTbM"[Z(VNUAaqe%+qRQL!*[K6$2jN(dXL-2`@6$1% +3i-bPk"a[U0G$b`2Q(T!!Z#RqTpL12$MTPdKPSZkLVGYU&!0"5hkJfBLTdcrHm9J +LeXeLA@*"X8DV0J3JC!HkRad4eYLaILP84(`"SCa9$VrrCEf8dR5K6dr`)-SR6h" +qhG3Zjk&0NqLH+NQjTDM'9'QJe,&'j@5)(K[*3@pc'i)J"PZm`E!LIReKbSKeKJ3 +",5mlH$9aDmpLH1e&Q1T%PED`V9CQre*0a"KcBN'r!40ZEM'XMT[Jk&DY"CbSK4l ++%LI)4lF(UTG#RL+-1Qb%RLTiTc(-J&F2Nk*Xk38ccJYEUb%('$+`X4,I+AUj*Ze +B"A&erR'bS2)#d#GI9e'h5M8QFKerLCE*V((2HR`J3-LK)(kP`Ba'AD-ph`+-,VI +i@U@-A#Y#0rN+$5HBUYcR"TJIYAe5k'!JH1HSrB(0'8[j--5K"m@aRec3Tj4B*aX +%pQ#*hhp+pRk,-mGH,"K-keUN`1T3P%LlM1'j)*a[JQh-q8E0Dj9Q92BZZ$1rjh" +LZA4!JB1&GHh22@9hef+PE,*Ci+Um2VA0(meKY`e4C%T4E@41@S8JF+54(-%2JJ' +!AFaQlhmJF-0RQP9`Ar(q#[D#m@ZSAdAS0p4r91eHLbe&QiY"%VXa*1fQdBkXE`T +JqYCq)DJB8mGPJBjA!fqUZFXTf'qRXXHZ&EF)$3J9kl4Z13&G0'(1Lc!1I&IS$RB +QGM(UfrmjmTeBG00H"`4SVHkl*[(RH@)f[DkfJK,Q4TRBfU0!q*T&!AME%PHd[8C +qB#-q8AqbDTZR5-PhKZe&kX!@KXVTGH0rM$[fUSf)qXDkPdGYQQ*c6ALaklm41pq +[2PNl"P1D+RRBUU3HJJBH)Qm4Y'Gmmd&q%eQVclGGMN2A2MjN3U2mSdNXRCN[mCB +&X28XK$lj-JrPra0RaM3[+$6Y@cIbGT[DY@Xk$[VHUa#2U(ej8ciJ&KijZjBM5e8 +cqal+cSb2`X6#9[8iNZ*b@NjE$prI#8dGA,`bGF`"FJU#kZT38`$+2%K9M&H&X#L +K&H*+&[IdR2RpH4Q5h`'hq*bCVQ#!Ih0JUr16$)CM![Bj03[X`8#,&3$K"Sf[ick +LqUd52f"[)XJCaA[HcrLj4M,f,kSC6fL+aq+ZU#6!VLl$$ddUcY@q1"RDA8#-Z6N +1@4!FNj`3FC2Q9J9%"5jRZc!2MTmjeL+T8DkJK&&k8#N,(&a4E2Lm5r4kkMM041# +pMd0M3%I(lQmd"m0J4rP[qN8TH*GB"q,1q39MJ)Ck[0kFdH"&B[pD`Q*P3PeFHTD +H1GcZiK3Ri%2G%ej3&rZ`Gmj`#"iLBL,cXE2(UrB2#2bS2'%EXB0J*6+-KFHU*0[ +(c%L8V)8riUCV54FeHHQ+6ajPhb#![-a''rkEmc3TjS[UdME$AZY4iNIrDE[5T+H +a4N+eQ)q16@aMk%#'+`HZe,dmE#K-d"$#&L&qbj!!CF%NlIep!aT81EqSaNVlGN6 +SY&SM6jc$E$8A92PMYmT*-Q)'&aF1k0h2RiTL3Bjm-&QPUcfi`FhCmjH[ENB2#b) +A#3!Kc@-pTG+NmINV*Fm@[JU&ZCi[dfYcdf9`QLFlQEaJ'RNChc,+rNP'R-3(G8h +8fZYh,&%ep*CrlC-lqeB`k4C5R!I,)S$leJZ3!)&NM#AP$(5LhZA#H"'H8Udl+C8 +`[FdiPlYMbPN`-Ud6L`NJJjZSe503kJ41KaSd4F`Zf"D(hGRd#-I9$GZjl51!PjS +%[$24AC+q,UM-TYUT5Ld'6-RlY)"Ip@E09kL3!1"@jqhQ'5A*p'V$PSAkSC16!Hl +T"86ba!iZMk5U!b+d0rpN#AUdRGPK+0-iB2@5m8[Il!U%Kj($S+0["iri@3HP$4h +93!5SbbRr3)RG8'h"'9!5$9T36*E80#Sh!653!1[M$M@X3HPI9'k45q5&VGKT2"Y +KDq8!pS,k4Dq`'6aiYj!!MIGbcl66kT%*C6-1icfpMY,aUTilNIKYCcU"L-+(8G[ +lf6-BZ@!"%("(DDSGH5e`K2A$IU$I%2clh$9eD0AK,@E[GV4`YGqRM)[XI&Gb'Cj +63$I%@%EAd@riMm*$3(%jBSV)$6Q+a5G*&q%2ql&LlXY"MI%bbaeFbP43hFD1iHi +YUiKhf-rKi$(S"rV8"XGiLKjqTMG(LPAL[EAiqpl&*1M$SHRF9aCL),Vi4Sm&GhF +`8STU*`%UD#&42U"p8&hXV$'dlG!ZMaLpD1hHEK9LQ(cr0+N#`2XI+4cQTXlF!80 +)#9@qbB3I(jhpcKAqVGH%r[Q1Q2Sej62E`I@"P)%#j'#BCN8M!P42U@"pmZ3r8(H +X2b%f4KF[a!UVjh!E%l'qX[(GT*EKJhm8@e&4SMP4Pm`S3j+JE1VJMK0ihbG8jSq +)cDmr5QG(,VG%i*FUTi`VV@k5AVU9qJ8r%9lIr(5&"(%R%r&pCqE*pq39MTpAIp8 +VprIG!P6A46'M[i)*mQkcpeI!90f)1Jj6I%0@[VlHPhN8`mS4f&HJj#2DpEQSRp0 +fqrcIhJVj4BX8"F$0Bbj03AFSjb2S*G4AALQCT+qlrhZZbVJIa`Mab#H@UcF%$+e +`,q5p'HL3!1%Y2Uc`bJ8*NhMTm$f!Gk*le%D$4`0q0+0c9)TQGZXDL3(f8Mri9aT +-3fk%QXIQdY)Q)'IPR5[T[bDL'-@(+VS5CTKAX3Y#*%-l(HGhF[#+B(5"'I*3mB- +Smj*#1mHRkjMr-RSEL#F4m[&3Xi6J0URFF6UTKIVfT[!H1*Yi-[TlT*502a!'d"e +N6*r53eIIk,Ie6G0qrhkRa1P!(HJV+!dMpRH0RZ@!qFar36a1GH,pZ3&@kpG'e@l +j[@)Z%Xhr,P0J&"cSf)6J+N!4J5EcJZ'6)PA2[C&ND$00fKfIXPS98jp`I3GfCl# +,'%%FdN&%p3B[G-qT@['E9ZCdEKf,ji@-MEQVL2F,(i-fPbGT"dD@5%)h`L-!J)A +MdAIhK"#Bdp&efU1qE8IT1VMB%A'U9BA4(1[!2#F(qbc'@bcRYD6K"4'jphIeb*c +`NRUSHDmrQ"38h$B-U0)-rfT1[GU#R8['FCP)i(T&NC)kbjcDRSPdBjl5@ME0q06 +E!eqmQT!!5VUUP+5klKTPMRKFi'Dh9U*'4p-0*c#2NI`IBCl9eKNkAcHVEEAfTM, +f%0Da20kR$EE6rH3GbPP&de4#U2NIe"&qEiiMAiVdP+hIFjTLDJ8C5M&JANK6E#B +VE)Y8iYMhDq[0S2dI"#G0aBSJDh#[L3f@T(bZU*Dr3eNX3fiCFJAAEJfR"[)J!,a +@!R@MRp$ie[Q2ViM4$p1Q80l+qH9!9+l@,+5%)[e#(+"k*&a`$20Y1DDd1(iY1C( +Q2B9+*Y@-%`eiBZXlaIpC,NPB6BSf)!"+P&!-KiZE&"!3Up@FM-'D-dbN5Z$qQBF +65E2DCM`-ik"`,cK)fTlVLd&D-r(F,4A92C@iFdE'+flqSVCHc'(#&4dqH+XKpl# +8GNq)5iYN@FKJc+@4)"il5e$P&[fj+&1rJf6Q3dQ949iY)Jfj1R3lbbUDcP%'Cj& +mRiI#5QellXaI98`22jj0ke-pB4[iePHH`EcD15)1b$5,h"NXAJr2NBEi)k'UU8' +hmFp5ZVrbkB$jRMiJCE@NmAD8`P%la+iLPFl)c9(J1CI2(NXFBlk[@U`T#l@&ZXJ +C"%C&6P@PV@'($X$3lq53!1!5U"TAh`)er@9aJ6ZjNCD`c0T6(CfL4jQT!CMXD*U +'[VdFA&VS59Cpee3h)UGTD35!M1a4*Jc9+0iTIPEKkT[$UAD9X@G0`qk3!0JKmhY +Z*!hjJ5LqYH+9Xk8-)q8`6,bJDDbXfGbkb&jI*-4qENrV2PkTckUlUT'GF!GUMbP +Pp)TK"S)if66R*dFEihMXKB#NVC+"3e4A(Nk2B!JAXQ0D)eAi5a@D32,TIXYrp`` +mSi4$m)q%MZ$`V$'X-l2E86QlH3KDl3Qrk,ETDNVc&ZkJ38ebMbQ%I&E(fm-$c&) +0@0NNCSbT*Z3+bq#0SZQCP(kHU3@P"-Z#maJ2E[h'lN'$j5!U3hSP,L9ZCB-T`m% +Z*NFL)G`q$HA`D[Yj3dHbZ3JQ*,LhHCFXl6"dQ)JpM9T(8R(q0dH3!#6[33C)4YQ +mqhNqN9)*eV(2A6i4T)Uh9XX,42(aL@lBlEi"eH#AKBl1c813!&pTDiiNGr-MTTk +$*pX93j!!P2)kcU6i)QJZ,RmjQ@I'R)"EahJRX-k$qcq5kUd+6V&4jIU"cUEBP9H +$c!M5V%FD@Fl"'6a40jrc*DBe!JGera51bQ8NRha!*$(L`Q$RVdQ,8#cc*aT3#D, +JKaJU#95Q-mP-B0qqe2*PH!3'RlPq-m68$+Fk#D)F)h%pS!P!jeN8!XKP5q["Cpb +VHT3K2NZe%RD`e&0L10*DBPNG8%T*G(KZ0i5YcL1+[0V-lFc35h+(+6E,+(VQdGr +ZKI)'&K2*3IX&B!Q(F+)33X6G$qah9jJm[EC6(6ImRCGMH['`ji[H4[$**e)+1!I +&42D-P(KabQ&&5kRjr5RQ5%19Fc#2eE"QrUQmNhcp!aEQQ3Rie"0"q*r!IL#YhdT +m+[L5XcR-KjDQ$(`+YLdC-DjSBLi#p%5R+1(b8KV9`EBDe`ZP!e+E1U+PlXjb*6T +)X@5i2-S#AdBd$8+U4m-KJN"T4p-jUdDIaMaZXJJMBfhr*K@Mq2CBdZDIZ)*p'@a +6PcUed$r'mAUkb[GZTIPh&[d`@Y)5qLAN,TG-imP,ka%CmJi@$RU#"&T6d31LDQd +DMDbDV9p+T*Gm!SA[GRb(+V@3!+%BTFFKf)"-F"D!NM@`#J&[!'MMFdp0IM$U5V2 +-IN#ViBI0JUL3!'UY0cL3!#qI@#afTK-![jap%XEeh5005r@e*ZQ8IRXT`CcVrF" +d)Nb0HJdQc#*"C#e!-b4B,HSU8)Fil9lK`V)4YE(*M19EbZr#ViLH3XCXBV6Yc%' +G4aM#bM[Lp20J9A)YD%[KGU&XU1-XjSVXc3#3!,hi)HK1UF3BKLQX0@0VG0D[f'3 +J"A8+H)UG8h9d4+R85MQbhh-l-cChlhNDC(dLApI5,kL50TeDi9pH$SeCl[iIS&c +Dk6cG'$NA1#HGTX`qAkXTJHZl1cbC#(Gc206Rf8aaM%#+$T!!MbHM+A,p)GaZ&e4 +hS0Z%BkAXK#aRkaSU2iZAB'bS[F%8"XTFdLQS&YKXi&!2(EZffe(#hqeJBAbjQCU +3!,ki[eD,0dFerJcmF8*F[Z!dZK,K1G#%IqNB6GI`jHkm4")kh@j910!"4hY"((H +,q`#Mq8*XCa506,-ek6LXMMNRICl+9GBqaZ+EjSR%5CbE8MXaX#S%Z!p"GR-I+0@ +CVf5bp4%r!`'ViN*X`4FRGGQh"I0m@G,IrpN!!!%!!!#Qd3!!TG%!!!!b!!!!!!! +!!!!!(!!b!!"TBfjc!!!!#Vqjrrm!!!!!!!!!!-2L: diff --git a/icons/clock_red.ico b/icons/clock_red.ico new file mode 100644 index 0000000..6170824 Binary files /dev/null and b/icons/clock_red.ico differ diff --git a/icons/clock_red.png b/icons/clock_red.png new file mode 100644 index 0000000..d1d560d Binary files /dev/null and b/icons/clock_red.png differ diff --git a/main.cpp b/main.cpp index 6ffbf64..b61b2e6 100644 --- a/main.cpp +++ b/main.cpp @@ -12,7 +12,7 @@ int main(int argc, char* argv[]) { QApplication app( argc, argv ); QApplication::setApplicationName( "RedTimer" ); - QApplication::setApplicationVersion( "0.0.4" ); + QApplication::setApplicationVersion( "0.0.5" ); // Command line options QCommandLineParser parser; diff --git a/qml.qrc b/qml.qrc index b143964..f7a0d3d 100644 --- a/qml.qrc +++ b/qml.qrc @@ -9,12 +9,14 @@ open-iconic/svg/media-play.svg open-iconic/svg/list.svg open-iconic/svg/cog.svg - open-iconic/svg/power-standby.svg open-iconic/svg/media-stop.svg MessageBox.qml MessageBoxForm.ui.qml open-iconic/svg/reload.svg icons/clock_red.svg open-iconic/svg/x.svg + open-iconic/svg/plus.svg + IssueCreator.qml + IssueCreatorForm.ui.qml diff --git a/qtredmine b/qtredmine index 6369678..013a88c 160000 --- a/qtredmine +++ b/qtredmine @@ -1 +1 @@ -Subproject commit 6369678d87414e5cfd2d9f49c36fbef9f3461426 +Subproject commit 013a88cbc3634c482dbb0050afdcf49a83d83706